Именованные семафоры в Python?

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

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

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

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

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

Ответ 1

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

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

Ответ 2

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

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