Python中的命名信号量?

15 投票
2 回答
9324 浏览
提问于 2025-04-15 22:31

我有一个用Python写的脚本,它使用了一种资源,但这个资源不能被同时运行的多个脚本过多地使用。

通常情况下,这种问题可以通过命名信号量来解决,但我在multiprocessing模块和threading模块的文档中找不到相关内容。

我是不是漏掉了什么,还是Python根本没有实现或提供命名信号量?更重要的是,如果答案是否定的,模拟一个的最佳方法是什么?

谢谢,
Boaz

PS:由于一些与这个问题不太相关的原因,我不能把任务聚合到一个持续运行的进程/守护进程中,也不能使用生成的进程——这两种方式似乎都可以在Python API中实现。

2 个回答

0

你可以通过使用文件系统来模拟它们,而不是使用内核路径(在某些平台上,命名信号量就是这样实现的)。你需要自己实现 sem_[open|wait|post|unlink] 这些功能,但其实这并不复杂。需要注意的是,你的同步开销可能会比较大(这取决于你在应用程序中需要多频繁地操作信号量),所以你可能想在启动进程时初始化一个内存磁盘,用来存储命名信号量。

另外,如果你不想自己动手实现,可以考虑把 boost::interprocess::named_semaphore这里有文档)封装成一个简单的扩展模块。

4

我建议使用一个第三方扩展,比如这些,特别是posix_ipc这个。你可以特别看看文档中的信号量部分。

这些模块主要是为了以一种类似Unix的方式来使用“System V IPC”(包括信号量),不过至少有一个模块(特别是posix_ipc)据说可以在Windows的Cygwin上使用(我没有验证这个说法)。在FreeBSD 7.2和Mac OSX 10.5上有一些已知的限制,所以如果你在使用这些平台时要小心。

撰写回答