我在python中有一个脚本,它使用的资源不能超过一定数量的并发脚本运行。
经典地,这可以通过命名的信号量来解决,但我无法在multiprocessing模块或threading的文档中找到它们。
我是否遗漏了某些未被Python实现/暴露的信号量?更重要的是,如果答案是否定的,那么模仿一个人的最佳方式是什么?
谢谢, 波阿斯
PS。由于与此问题不太相关的原因,我无法将任务聚合到持续运行的进程/守护进程或使用生成的进程 - 这两者似乎都适用于python API。
答案 0 :(得分:4)
我建议使用these之类的第三方扩展程序,最好是posix_ipc
扩展程序 - 请参阅文档中的sempahore部分。
这些模块主要是以一种单一的方式暴露“系统V IPC”(包括信号量),但至少有一个(特别是posix_ipc
)声称可以在Windows上与Cygwin一起工作(我没有' t验证了该声明)。在FreeBSD 7.2和Mac OSX 10.5上有一些文档limitations,所以请注意这些平台对你很重要。
答案 1 :(得分:0)
您可以使用文件系统而不是内核路径来模拟它们(命名信号量无论如何都会在某些平台上以这种方式实现)。你必须自己实现sem_[open|wait|post|unlink]
,但这样做应该是相对微不足道的。您的同步开销可能很大(取决于您在应用程序中调整信号量的频率),因此您可能希望在启动存储命名信号量的进程时初始化ramdisk。
或者,如果您不习惯自己滚动,可以将boost::interprocess::named_semaphore
(docs here)包装在一个简单的扩展模块中。