LINUX.ORG.RU
решено ФорумTalks

Почему стандартные питоновские библиотеки такие непродуманные?

 , ,


1

4

Смотрим модуль multiprocessing. Ага, круто, вроде всё что нужно есть! Куча примитивов для синхронизации между процессами. Хотя... если присмотреться поближе, окажется, что НИ ОДИН из них не работает для разных процессов. Только с дочерними процессами и только если дочерний процесс является прямым форком текущего (python -> сторонняя хрень -> python уже никак).

Смотрим модуль tempfile. Казалось бы, ну как тут можно налажать?! А вот как:

  • Нет класса-обёртки для временных директорий.
  • Нет возможности выключить автоудаление у NamedTemporaryFile. Создали файл, форкнулись (тем же multiprocessing.Process) и получили исключение на stderr, так как глупый питон пытался удалить один и тот же файл дважды.

ctypes.util.find_library() - замечательная функция! Только вот свои пути ей не подсунуть, да и в LD_LIBRARY_PATH она не может.

Ждать в одном потоке IO одновременно с нескольких источников? Или даже ещё и сигналы ждать одновременно с этим? Да не, ну кому такое может понадобиться? Ведь всегда можно на каждый чих наплодить по 100500 потоков =). Ивентлуп? Не, не слышали.

Deleted

Последнее исправление: Deleted (всего исправлений: 3)

Вопрос риторический. Задавать можно про любой язык.

Вообще потому, что сразу и все сделать грамотно - нереально. А потом начинается совместимость.

Nagwal ★★★★
()

Это ты ещё потроха языка не видел.

aedeph_ ★★
()

Нет возможности выключить автоудаление у NamedTemporaryFile. Создали файл, форкнулись (тем же multiprocessing.Process) и получили исключение на stderr, так как глупый питон пытался удалить один и тот же файл дважды.

Вот эту хрень я обошёл путём ампутации __del__ у объекта, и замены его на лямбду, которая ничего не делает. Очень злой хак, но тем не менее это помогло.

Deleted
()

НИ ОДИН из них не работает для разных процессов. Только с дочерними процессами и только если дочерний процесс является прямым форком текущего (python -> сторонняя хрень -> python уже никак)

Чем тебя не устроил multiprocrssing.connection.{Listener,Client}?

Ждать в одном потоке IO одновременно с нескольких источников?

А это о чем вообще?

tailgunner ★★★★★
()

Еще один всё понял. Поставлять такую огромную стандартную библиотеку, как в питоне, - тупиковая ветвь развития. Сразу порождает кучу проблем. Первая: стандартная библиотека устарела -> давайте перепишем и подадим с новой версией языка -> разработчику пофиг, что там за сверхновый код, поскольку стандартная библиотека у него повсеместно, и в случае апгрейда он за***тся переписывать -> разработчик клал болт на новую версию языка, продолжая использовать старую. Второе: каноническая реализация - зло, разработчик должен быть в праве выбирать лучшее -> это порождает естественный отбор -> прогресс.

mironov_ivan, ты некрасиво поступил, снеся предыдущую тему, теперь весь коммент пишу с нуля.

iVS ★★★★★
()
Ответ на: комментарий от tailgunner

Чем тебя не устроил multiprocrssing.connection.{Listener,Client}?

Тем, что это не средство синхронизации. Мне нужны семафоры какие-нибудь.

А это о чем вообще?

Это об удобных обёртках для poll() и сотоварищей.

Deleted
()
Ответ на: комментарий от iVS

mironov_ivan, ты некрасиво поступил, снеся предыдущую тему, теперь весь коммент пишу с нуля.

Я хотел снести эту тему, так как запостил её случайно каким-то хоткеем, но в ней уже был коммент.

Deleted
()
Ответ на: комментарий от Deleted

Чем тебя не устроил multiprocrssing.connection.{Listener,Client}?

Тем, что это не средство синхронизации. Мне нужны семафоры какие-нибудь.

Если ты хочешь синхронизоваться через третий процесс, ты хочешь странного. Если ты не можешь сделать из сокета семафор, ты профнепригоден.

Ждать в одном потоке IO одновременно с нескольких источников?

А это о чем вообще?

Это об удобных обёртках для poll() и сотоварищей.

Странно, у меня poll и без оберток ждет из нескольких источников.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Если ты хочешь синхронизоваться через третий процесс, ты хочешь странного.

Жизнь такая, да.

Если ты не можешь сделать из сокета семафор, ты профнепригоден.

Я могу сделать троллейбус из буханки хлеба, но зачем? 8)

Странно, у меня poll и без оберток ждет из нескольких источников.

И писать на C на питоне я тоже умею. Но это всё-таки питон, а не C, так что хочется побольше удобств и готовых паттернов.

Deleted
()
Ответ на: комментарий от Deleted

Я могу сделать троллейбус из буханки хлеба, но зачем? 8)

Жизнь у тебя такая.

хочется побольше удобств и готовых паттернов.

А так же баззвордов и мемов.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Жизнь у тебя такая.

Иногда приходится делать странные и нестандартные вещи. Иногда это даже бывает интересно.

Blah blah blah...

А?

Deleted
()
Ответ на: комментарий от Deleted

Иногда приходится делать странные и нестандартные вещи

Да. Например, передачу токена для взаимного исключения.

Ко-ко-ко

Вот и поговорили.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Да. Например, передачу токена для взаимного исключения.

Только непонятно зачем вообще тогда у питона стандартная библиотека, если она никуда не годится для серьёзного использования?

Deleted
()
Ответ на: комментарий от Virtuos86

когда ты поймешь это про свой

Дык, теоретически, он должен соответствовать моим идеалам.

Практически, я пока не придумал как осуществить задуманное в допустимые сроки. Как только пойму — сразу сделаю.

true_admin ★★★★★
()
Ответ на: комментарий от Deleted

Только непонятно зачем вообще тогда у питона стандартная библиотека

Это просто - она для решения стандартных задач. А если тебе

mironov_ivan> приходится делать странные и нестандартные вещи

не ной, что в документации не написано, как их делать.

если она никуда не годится для серьёзного использования?

Ну, это же не помешало тебе использовать ее в своей серррьезной задаче.

tailgunner ★★★★★
()
Ответ на: комментарий от true_admin

Я думаю, речь шла о вот таких конструкциях: https://gobyexample.com/timeouts

Ты привел это для примера чего - того, что в одной нити можно ждать IO из разных источников, или того, что для каждого источника придется создать отдельную нить?

tailgunner ★★★★★
()

Ждать в одном потоке IO одновременно с нескольких источников? Или даже ещё и сигналы ждать одновременно с этим? Да не, ну кому такое может понадобиться? Ведь всегда можно на каждый чих наплодить по 100500 потоков =). Ивентлуп? Не, не слышали.

В 3.4 добавили asyncio

maxcom ★★★★★
()
Ответ на: комментарий от tailgunner

Ты привел это для примера чего

Там есть концепция каналов и событий на уровне ЯП. В питоне такого нет (ну почти, есть полуживой gevent). Вот этого не хватает. Поэтому, да, я запускаю отдельные треды на каждое IO, делаю очереди и ... Короче, возвожу колхоз. Доктор, я всё делаю неправильно?

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

не-не, я не умею что-то большое писать на языках с динамической типизацией

maxcom ★★★★★
()
Ответ на: комментарий от true_admin

Поэтому, да, я запускаю отдельные треды на каждое IO, делаю очереди и ... Короче, возвожу колхоз. Доктор, я всё делаю неправильно?

Ты делаешь примерно так, как в приведенном примере на Go. Делать так или ждать в poll на файловых дескрипторах - зависит от обстоятельств и/или предпочтений.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Это просто - она для решения стандартных задач. А если тебе

mironov_ivan> приходится делать странные и нестандартные вещи

не ной, что в документации не написано, как их делать.

Нестандартная только для питона. В libc есть всё, что нужно.

Deleted
()
Ответ на: комментарий от maxcom

В 3.4 добавили asyncio

По причине корпоративной бюрократии я ограничен только питоном 2.6 и его стандартной библиотекой =(.

Deleted
()
Ответ на: комментарий от tailgunner

А какой ты ожидаешь? Что я могу написать модуль на C и юзать его? Или что я могу дёргать нужные функции через ctypes? Или что питон - говно? Или что его стандартная библиотека - говно?

Deleted
()
Ответ на: комментарий от Deleted

В libc есть всё, что нужно.

Даже интересно - какой вывод ты из этого делаешь.

А какой ты ожидаешь?

Абсолютно любой. Мне просто интересно, какой именно он будет.

tailgunner ★★★★★
()
Ответ на: комментарий от ksa242

tempfile.NamedTemporaryFile(delete=True) же.

Блин, надо больше спать. Спасибо. Похоже этот атрибут можно изменять после создания файла.

Deleted
()

Ждать в одном потоке IO одновременно с нескольких источников? Или даже ещё и сигналы ждать одновременно с этим? Да не, ну кому такое может понадобиться? Ведь всегда можно на каждый чих наплодить по 100500 потоков =). Ивентлуп? Не, не слышали.

asyncore?

ksa242
()
Ответ на: комментарий от tailgunner

=)

Абсолютно любой. Мне просто интересно, какой именно он будет.

Я сейчас уставший и раздражённый, так что выбираю «петон - говно».

Deleted
()
Ответ на: комментарий от ksa242

asyncore?

Иииииии... второе Большое Спасибо уходит к ksa242 =).

Deleted
()

Ждать в одном потоке IO одновременно с нескольких источников?

Tornado же и Twisted есть.

Vovka-Korovka ★★★★★
()
Ответ на: комментарий от Reset

Почему в нормальных языках такой проблемы не возникает?

Возникает. Это не зависит от ЯП.

true_admin ★★★★★
()
Ответ на: комментарий от Deleted

Вот эту хрень я обошёл путём ампутации __del__ у объекта, и замены его на лямбду, которая ничего не делает. Очень злой хак, но тем не менее это помогло.

А тупо унаследоваться и переопределить __del__ не вариант?

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

А тупо унаследоваться и переопределить __del__ не вариант?

Выше уже подсказали, что я идиот, и что у NamedTemporaryFile() есть параметр delete. И что у возвращаемого объекта тоже есть параметр delete, который можно менять.

Deleted
()
Ответ на: комментарий от BattleCoder

Будем. Когда OpenJDK 8 в Федоре будет не в состоянии developer preview

maxcom ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.