多线程队列

时间:2016-10-24 11:45:24

标签: python multithreading priority-queue

我在一个单独的线程中处理了一个队列。当我从主线程填充作业时,只有最后一个作业被多次处理。如果我在每个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()

现在的问题是为什么?

0 个答案:

没有答案