У меня есть сценарий в Python, который использует ресурс, который не может использоваться больше, чем определенное количество параллельного выполнения сценариев.
Классически, это было бы решено именованные семафоры, но я не могу найти семафоры в документации многопроцессорного модуля или поточной обработки.
Я отсутствую, что-то или разве названный семафорами не реализовано / выставленный Python? и что еще более важно, если ответ не, что лучший способ состоит в том, чтобы эмулировать тот?
Спасибо, Боаз
PS. По причинам, которые не так относятся к этому вопросу, я не могу агрегировать задачу к непрерывно рабочему процессу/демону или работать с порожденными процессами - оба из которых, кажется, работали бы с Python API.
Я предлагаю стороннее расширение вроде этих, в идеале posix_ipc
- смотрите, в частности, раздел sempahore в документации.
Эти модули в основном предназначены для раскрытия "системного V IPC" (включая семафоры) unixy способом, но по крайней мере один из них (posix_ipc
в частности), как утверждается, работает с Cygwin на Windows (я не проверял это утверждение). Есть некоторые документированные ограничения на FreeBSD 7.2 и Mac OSX 10.5, так что будьте осторожны, если эти платформы важны для вас.
Вы можете эмулировать их, используя файловую систему вместо пути ядра (именованные семафоры так реализованы на некоторых платформах). Вам придется реализовать sem_[open|wait|post|unlink]
самостоятельно, но это должно быть относительно тривиально. Накладные расходы на синхронизацию могут быть значительными (в зависимости от того, как часто вам придется возиться с семафором в вашем приложении), поэтому вам, возможно, захочется инициализировать ramdisk при запуске вашего процесса, в котором будут храниться именованные семафоры.
В качестве альтернативы, если вам неудобно создавать свой собственный, вы можете обернуть boost::interprocess::named_semaphore
(docs here) в простой модуль расширения.