【问题标题】:Named semaphores in Python?Python中的命名信号量?
【发布时间】:2011-02-17 10:18:36
【问题描述】:

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

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

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

谢谢, 波阿斯

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

【问题讨论】:

    标签: python multithreading semaphore cross-process


    【解决方案1】:

    我建议使用像 these 这样的第三方扩展程序,最好是 posix_ipc 一个 - 请特别参阅文档中的 sempahore 部分。

    这些模块主要是关于以统一的方式公开“system V IPC”(包括信号量),但其中至少一个(特别是posix_ipc)声称可以在 Windows 上与 Cygwin 一起使用(我尚未验证该主张)。 FreeBSD 7.2 和 Mac OSX 10.5 上有一些记录在案的 limitations,因此请注意这些平台是否对您很重要。

    【讨论】:

      【解决方案2】:

      您可以通过使用文件系统而不是内核路径来模拟它们(无论如何,命名信号量在某些平台上都是以这种方式实现的)。您必须自己实现sem_[open|wait|post|unlink],但这样做应该相对简单。您的同步开销可能很大(取决于您必须在应用程序中调整信号量的频率),因此您可能希望在启动存储命名信号量的进程时初始化 ramdisk。

      或者,如果您不喜欢自己滚动,您可以将boost::interprocess::named_semaphore (docs here) 包装在一个简单的扩展模块中。

      【讨论】:

      • 有很多方法可以解决这个问题(公平、调度唤醒、竞争条件)。使用内核或 libc 原语(例如,真正的 sem_* API,或 Windows 中的 CreateSemaphore/event API);避免滚动您自己的同步原语。
      • 这就是为什么我建议如果您不喜欢自己滚动,可以使用 boost。
      • @NickBastin 有什么办法可以“自己动手”吗? (缺少包装 libc 或 Boost?)您说“您必须自己实现 sem_[open|wait|post|unlink],但这样做应该相对微不足道”但是,除了(非)微不足道的问题,您究竟会如何根据可能的竞争条件这样做吗?您将如何确保信号量操作的原子性?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-01
      • 2011-10-23
      • 2012-08-02
      • 2012-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多