我有一个Python脚本,它使用的资源不能被超过一定数量的并发脚本运行所使用。
通常,这可以通过命名信号量来解决,但我在 multiprocessing 模块或 threading 的文档中找不到这些信号量。
我是否遗漏了某些东西或者未由 Python 实现/公开的命名信号量?更重要的是,如果答案是否定的,那么模仿的最佳方法是什么?
谢谢, 波阿斯
PS。由于与这个问题不太相关的原因,我无法将任务聚合到连续运行的进程/守护进程或使用生成的进程 - 这两者似乎都可以与 python API 一起使用。
您可以使用文件系统而不是内核路径来模拟它们(无论如何,命名信号量在某些平台上都是以这种方式实现的)。 您必须自己实现
sem_[open|wait|post|unlink]
,但这样做应该相对简单。 您的同步开销可能会很大(取决于您在应用程序中摆弄信号量的频率),因此您可能需要在启动进程时初始化一个 ramdisk 来存储命名信号量。
或者,如果您不习惯自己动手,您可以将
boost::interprocess::named_semaphore
(文档此处)包装在一个简单的扩展模块中。
长期以来,我一直对 Python 中缺乏命名信号量感到沮丧。
我从未完全相信在我的项目中使用
posix_ipc
,因为它缺乏类型提示和文档字符串。
最近我编写了 named-semaphores 将
posix-ipc
包装在更接近 threading.Semaphore
的 Pythonic API 中。
它是一个紧凑的单一模块,易于阅读,因此任何谨慎的开发人员都可以在需要时检查后台发生的情况。
它对我很有用,所以我想分享,以防它对其他人有帮助!