我在一个单独的线程中处理了一个队列。当我从主线程填充作业时,只有最后一个作业被多次处理。如果我在每个join()
之间使用put()
阻止队列,它就可以工作,但这并不能满足我的需要。在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
我已经阅读了一些关于使用多处理来解决它的事情,但对于我想要的简单行为来说这似乎很复杂......
我不明白的另一件事是为什么我必须将Q.qsize()
包括在其他内容中
提出了TypeError:unorderable类型:function()<函数()
。我没有在Python 2.7中这样做
如果你能帮助我,我将非常高兴
******编辑******
所以你不能像我一样使用lambda函数。你必须使用像这样的元组将带参数的函数放入队列中:
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()
现在的问题是为什么?