是否有可能在python中有一个公平的信号量,保证阻塞线程按照他们调用acquire()
的顺序解除阻塞?
答案 0 :(得分:6)
您可能需要从其他活动部件构建一个。例如,创建一个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()
我认为这种方法的弱点在于执行set / release的线程必须等待等待的线程出现,而真正的信号量会让几个版本继续进行,即使没有人在等待吗?
答案 1 :(得分:0)
随着Brandon解决了“公平信号量”问题,查看相关的障碍问题,线程等待点,然后同时发布可能是有用的:http://docs.python.org/py3k/whatsnew/3.2.html#threading