Python 中的命名信号量?

问题描述 投票:0回答:3

我有一个Python脚本,它使用的资源不能被超过一定数量的并发脚本运行所使用。

通常,这可以通过命名信号量来解决,但我在 multiprocessing 模块或 threading 的文档中找不到这些信号量。

我是否遗漏了某些东西或者未由 Python 实现/公开的命名信号量?更重要的是,如果答案是否定的,那么模仿的最佳方法是什么?

谢谢, 波阿斯

PS。由于与这个问题不太相关的原因,我无法将任务聚合到连续运行的进程/守护进程或使用生成的进程 - 这两者似乎都可以与 python API 一起使用。

python multithreading semaphore cross-process
3个回答
4
投票

我建议使用像 这些这样的第三方扩展,最好是

posix_ipc
扩展 - 特别请参阅文档中的 semaphore 部分。

这些模块主要是关于以 unixy 方式公开“system V IPC”(包括信号量),但至少其中一个(特别是

posix_ipc
)据称可以在 Windows 上与 Cygwin 一起使用(我尚未验证该声明) )。 FreeBSD 7.2 和 Mac OSX 10.5 上存在一些已记录的限制,因此如果这些平台对您很重要,请务必小心。


0
投票

您可以使用文件系统而不是内核路径来模拟它们(无论如何,命名信号量在某些平台上都是以这种方式实现的)。 您必须自己实现

sem_[open|wait|post|unlink]
,但这样做应该相对简单。 您的同步开销可能会很大(取决于您在应用程序中摆弄信号量的频率),因此您可能需要在启动进程时初始化一个 ramdisk 来存储命名信号量。

或者,如果您不习惯自己动手,您可以将

boost::interprocess::named_semaphore
文档此处)包装在一个简单的扩展模块中。


0
投票

长期以来,我一直对 Python 中缺乏命名信号量感到沮丧。

我从未完全相信在我的项目中使用

posix_ipc
,因为它缺乏类型提示和文档字符串。

最近我编写了 named-semaphores

posix-ipc
包装在更接近
threading.Semaphore
的 Pythonic API 中。

它是一个紧凑的单一模块,易于阅读,因此任何谨慎的开发人员都可以在需要时检查后台发生的情况。

它对我很有用,所以我想分享,以防它对其他人有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.