【发布时间】:2011-09-06 00:32:04
【问题描述】:
我正在使用信号量将工作交给 Python 中的另一个线程。 IE。主线程将一个项目放入队列中,然后调用信号量的release 方法;工作线程将在信号量上调用acquire,然后从队列中弹出一个项目以进行处理。
还有一个特殊的 TERMINATE 项,master 可以放入队列中,它指示 worker 结束。我的问题是,工人是否应该在信号量终止之前发出acquires 以匹配信号量上的任何未完成的releases?信号量属于worker对象,线程终止后不再使用;然而,该过程可能会长期存在并在未来创建许多工作对象/线程/信号量。
放弃计数非零的信号量是否安全? (我怀疑是这样,但我想仔细检查一下。)
无论是否安全,您(主观上)认为在结束之前完全清理信号量是否“更好”?
我最感兴趣的是 Python(尤其是 CPython)中的信号量行为。然而,任何关于其他语言(例如 C 的 pthreads)信号量的一般知识也将受到欢迎。
【问题讨论】:
-
我知道这不是您问题的答案,但听起来您可能会受益于 Python 的同步 Queue 类,专为这种情况而设计。
-
“工人是否应该以发出获取来匹配信号量上的任何未完成的发布?”:在 TERMINATE 项目之后会有项目吗?
-
队列看起来确实很有用,所以我可能会重写以使用它。虽然我很欢迎编写自己的实现作为初稿的多线程练习......
-
@Nayuki - 可能有;允许工人忽略 TERMINATE 之后的任何项目。
-
如果你喜欢可扩展的设计,AMQP 值得一看,试试 Celery (celeryproject.org)。它的扩展性比线程/信号量好得多,因为生产者和消费者可以在不同的机器上运行。
标签: python multithreading semaphore