Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多线程队列_Python_Multithreading_Priority Queue - Fatal编程技术网

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() 这是提高。我不必在Python2.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()

现在的问题是为什么?

优先级队列不是线程安全的。这并不能解决您的问题,但可能会节省您很多时间。@erip说了什么,至于
为什么?
您可能想读一读:好的,谢谢!这个链接非常有用!实际上这里写的是:“在内部,模块使用锁来临时阻止竞争线程;但是,它不是设计用来处理线程内的可重入性的。”这意味着线程安全。优先级队列不是线程安全的。这并不能解决您的问题,但可能会节省您很多时间。@erip说了什么,至于
为什么?
您可能想读一读:好的,谢谢!这个链接非常有用!实际上这里写的是:“在内部,模块使用锁来临时阻止竞争线程;但是,它不是设计用来处理线程内的可重入性的。”这意味着线程安全。