2010-05-09 3 views
11

У меня есть скрипт в python, который использует ресурс, который не может использоваться более чем определенным количеством одновременных запущенных скриптов.Именованные семафоры в Python?

Классически это будет решаться с помощью названных семафоров, но я не могу найти их в документации модуля multiprocessing или threading.

Я что-то пропустил или назван семафорами, не реализованными/выставленными Python? и что еще более важно, если ответ отрицательный, каков наилучший способ его подражания?

Спасибо, Боаз

PS. По причинам, которые не имеют отношения к этому вопросу, я не могу объединить задачу с непрерывно запущенным процессом/демоном или работать с порожденными процессами - обе из них, похоже, работали бы с API-интерфейсом python.

ответ

4

Я предлагаю стороннее расширение, например these, в идеале - posix_ipc - см., В частности, раздел sempahore в документах.

Эти модули в основном предназначены для разоблачения «системы V IPC» (включая семафоры) по-разному, но, по крайней мере, один из них (posix_ipc конкретно), как утверждается, работает с Cygwin в Windows (я еще не подтвердил, что Запрос). Есть некоторые документированные limitations на FreeBSD 7.2 и Mac OSX 10.5, поэтому будьте осторожны, если эти платформы важны для вас.

0

Вы можете эмулировать их, используя файловую систему вместо пути ядра (так называемые семафоры реализованы таким образом на некоторых платформах так или иначе). Вам придется реализовать sem_[open|wait|post|unlink] самостоятельно, но для этого должно быть относительно тривиально. Накладные расходы на синхронизацию могут быть значительными (в зависимости от того, как часто приходится сталкиваться с семафором в вашем приложении), поэтому вы можете захотеть инициализировать ramdisk при запуске процесса хранения именованных семафоров.

В качестве альтернативы, если вам не удобно кататься самостоятельно, вы, вероятно, можете обернуть boost::interprocess::named_semaphore (docs here) в простой модуль расширения.

+2

Существует множество способов сделать это неправильно (справедливость, планирование пробуждения, условия гонки). Используйте примитивы ядра или libc (например, настоящий sem_ * API или API CreateSemaphore/event в окнах); не накапливайте свои собственные примитивы синхронизации. –

+1

Вот почему я предлагаю, чтобы вы могли использовать boost, если вам неудобно кататься самостоятельно. –

Смежные вопросы