Python 多线程队列
我有一个单独线程处理的队列。当我从主线程填充作业时,只有最后一个作业被多次处理。如果我在每个Python 多线程队列,python,multithreading,priority-queue,Python,Multithreading,Priority Queue,我有一个单独线程处理的队列。当我从主线程填充作业时,只有最后一个作业被多次处理。如果我在每个put()之间用一个join()阻塞队列,它就会起作用,但这并不能满足我的需要。在Python 3中: Q = PriorityQueue() def processQ(): while True : if not Q.empty(): job = Q.get(False) job[1]() Q.task_d
put()
之间用一个join()
阻塞队列,它就会起作用,但这并不能满足我的需要。在Python 3中:
Q = PriorityQueue()
def processQ():
while True :
if not Q.empty():
job = Q.get(False)
job[1]()
Q.task_done()
def fill():
for i in range(0,100):
Q.put(((1, Q.qsize()), lambda: print(i)))
def main():
Thread(target=lambda: processQ()).start()
fill()
输出为:
99
99
99
99
etc... 100 times
我读过一些关于用多重处理解决这个问题的文章,但对于我想要的简单行为来说,这似乎非常复杂
另一件我不明白的事情是,为什么我必须在put a中包含Q.qsize()
TypeError:无序类型:function()for i in range(0,100):
Q.put(((1, Q.qsize()), (print, i)))
def processQ():
while True :
if not Q.empty():
job = Q.get(False)
func = job[1][0] # [0] is the priority, [1:] are the arguments
args = job[1][1:]
func(*args)
Q.task_done()
现在的问题是为什么?优先级队列不是线程安全的。这并不能解决您的问题,但可能会节省您很多时间。@erip说了什么,至于
为什么?
您可能想读一读:好的,谢谢!这个链接非常有用!实际上这里写的是:“在内部,模块使用锁来临时阻止竞争线程;但是,它不是设计用来处理线程内的可重入性的。”这意味着线程安全。优先级队列不是线程安全的。这并不能解决您的问题,但可能会节省您很多时间。@erip说了什么,至于为什么?
您可能想读一读:好的,谢谢!这个链接非常有用!实际上这里写的是:“在内部,模块使用锁来临时阻止竞争线程;但是,它不是设计用来处理线程内的可重入性的。”这意味着线程安全。