【发布时间】:2011-12-30 19:14:22
【问题描述】:
是否有可能在 python 中有一个公平的信号量,保证阻塞线程按照它们调用acquire() 的顺序被解除阻塞?
【问题讨论】:
标签: python synchronization semaphore
是否有可能在 python 中有一个公平的信号量,保证阻塞线程按照它们调用acquire() 的顺序被解除阻塞?
【问题讨论】:
标签: python synchronization semaphore
您可能必须从其他活动部件中构建一个。例如,创建一个Queue.Queue(),每个听众都会向其中发布一个全新的Event(),然后等待。当需要唤醒其中一个等待线程时,弹出队列中等待时间最长的项目——它将是那些事件对象之一——并通过event.set()释放线程。
显然,您也可以为每个等待进程使用一个信号量,但我喜欢 Event 的语义,因为它显然只能发生一次,而信号量的语义是它的值可以支持许多等待线程。
设置系统:
import Queue
big_queue = Queue.Queue()
然后,等待:
import threading
myevent = threading.Event()
big_queue.put(myevent)
myevent.wait()
并释放其中一个等待线程:
event = big_queue.get()
event.set()
我想这种方法的弱点是执行设置/释放的线程必须等待等待线程的出现,而真正的信号量即使没有人在等待,也会让多个释放继续进行?
【讨论】:
布兰登已经解决了“公平信号量”问题,看看相关的障碍问题可能会很有用,这是线程到达然后同时被释放的等待点:http://docs.python.org/py3k/whatsnew/3.2.html#threading
【讨论】: