Python JoinableQueue和队列线程未完成

时间:2018-10-04 13:49:03

标签: python multithreading

我正在使用以下代码来通过Queue和Joinable Queue使用多线程来完成一项任务。有时,脚本会在其他时间完美执行,而在任务结束时停顿而又不终止工作进程,并且不会继续执行脚本的下一部分。我是使用Queue和JoinableQueue的新手,我需要找出为什么发生这种停顿。

在代码的这一部分之前,我运行另一个Queue,JoinableQueue worker可以下载一些数据,并且每次都能很好地工作。我是否需要从第一个Queue / JoinableQueue关闭()任何东西?有没有办法检查它是否停转,是否继续?

这是我的代码:

import multiprocessing
from multiprocessing import Queue
from multiprocessing import JoinableQueue
from threading import Thread

def run_this_definition(hr):
    #do things here
    return()

def worker():
while True:
    item = jq.get()
    run_this_definition(item)
   jq.task_done()
return()

q = Queue()
jq = JoinableQueue()

number_of_threads = 8

for i in range(number_of_threads):
    t = Thread(target=worker)
    t.daemon = True
    t.start() 

input_list = [0,1,2,3,4]
for item in input_list:
    jq.put(item)
jq.join()
print "finished" 

脚本停顿时从不打印“完成”,但似乎在队列最后一个项目“ run_this_definition”的末尾完成了所有任务和停顿。

1 个答案:

答案 0 :(得分:0)

我的猜测是您正在使用multiprocessing.JoinableQueue() !?使用Queue.Queue()进行线程化。它有一个.join()和一个.task_done() method as well。此外,您应该将队列作为参数传递给线程:请参见以下示例:

import threading
from threading import Thread
from Queue import Queue

def worker(jq):
    while True:
        item = jq.get()
        # Do whatever you have to do.
        print '{}: {}'.format(threading.currentThread().name, item)
        jq.task_done()
    return()

number_of_threads = 4
input_list = [1,2,3,4,5]
jq = Queue()
for i in range(number_of_threads):
    t = Thread(target=worker, args=(jq,))
    t.daemon = True
    t.start()
for item in input_list:
    jq.put(item)
jq.join()

print "finished"

来自多个线程的打印输出可能看起来很杂乱,但是作为示例应该没问题。

面向未来:请提供您的代码的完整示例。您的示例中都未定义导入,也未定义number_of_threadsrun_this_definitioninput_list