我正在使用以下代码来通过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”的末尾完成了所有任务和停顿。
答案 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_threads
,run_this_definition
或input_list
。