【问题标题】:Cleanup of semaphore in PythonPython中信号量的清理
【发布时间】:2011-09-06 00:32:04
【问题描述】:

我正在使用信号量将工作交给 Python 中的另一个线程。 IE。主线程将一个项目放入队列中,然后调用信号量的release 方法;工作线程将在信号量上调用acquire,然后从队列中弹出一个项目以进行处理。

还有一个特殊的 TERMINATE 项,master 可以放入队列中,它指示 worker 结束。我的问题是,工人是否应该在信号量终止之前发出acquires 以​​匹配信号量上的任何未完成的releases?信号量属于worker对象,线程终止后不再使用;然而,该过程可能会长期存在并在未来创建许多工作对象/线程/信号量。

  1. 放弃计数非零的信号量是否安全? (我怀疑是这样,但我想仔细检查一下。)

  2. 无论是否安全,您(主观上)认为在结束之前完全清理信号量是否“更好”?

我最感兴趣的是 Python(尤其是 CPython)中的信号量行为。然而,任何关于其他语言(例如 C 的 pthreads)信号量的一般知识也将受到欢迎。

【问题讨论】:

  • 我知道这不是您问题的答案,但听起来您可能会受益于 Python 的同步 Queue 类,专为这种情况而设计。
  • “工人是否应该以发出获取来匹配信号量上的任何未完成的发布?”:在 TERMINATE 项目之后会有项目吗?
  • 队列看起来确实很有用,所以我可能会重写以使用它。虽然我很欢迎编写自己的实现作为初稿的多线程练习......
  • @Nayuki - 可能有;允许工人忽略 TERMINATE 之后的任何项目。
  • 如果你喜欢可扩展的设计,AMQP 值得一看,试试 Celery (celeryproject.org)。它的扩展性比线程/信号量好得多,因为生产者和消费者可以在不同的机器上运行。

标签: python multithreading semaphore


【解决方案1】:

#1:是的,放弃具有非零计数的信号量是安全的。毕竟只是一个值。

#2:减少代码量会更好。努力为正确的实现编写最少数量的清晰代码。

【讨论】:

  • 它只是一个值吗? Python 中的信号量对象具有关联的条件、锁、服务员列表等......我想检查所有这些东西是否也可以安全地放弃。我不确定实现细节是否可能使用当计数大于 0 时可能无法正确清理的其他资源。
  • 好吧,与信号量相关的内部簿记不应依赖于信号量的值。我非常有信心不需要“清零”。
  • 我认为你是对的。毕竟,我们可以创建一个初始值不为零的信号量,并且没有讨论是否打算在信号量的生命周期结束时回归到初始值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-25
  • 1970-01-01
  • 1970-01-01
  • 2014-02-08
  • 2015-10-09
相关资源
最近更新 更多