Именованные семафоры в 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 здесь) в простой модуль расширения.