Python JoinableQueue和队列线程未完成
我正在使用下面的代码来完成一项任务,该任务使用多线程处理队列和可连接队列。有时脚本执行得非常完美,但有时它会在任务结束时暂停,而不会结束辅助进程,并且不会继续执行脚本的下一部分。我对使用Queue和JoinableQueue还不熟悉,我需要找出为什么会发生这种延迟 在代码的这一部分之前,我运行另一个队列JoinableQueue worker来下载一些数据,它每次都工作得非常好。我需要关闭()第一个队列/JoinableQueue中的任何东西吗?有没有办法检查它是否停止,如果是,继续 这是我的密码:Python JoinableQueue和队列线程未完成,python,multithreading,Python,Multithreading,我正在使用下面的代码来完成一项任务,该任务使用多线程处理队列和可连接队列。有时脚本执行得非常完美,但有时它会在任务结束时暂停,而不会结束辅助进程,并且不会继续执行脚本的下一部分。我对使用Queue和JoinableQueue还不熟悉,我需要找出为什么会发生这种延迟 在代码的这一部分之前,我运行另一个队列JoinableQueue worker来下载一些数据,它每次都工作得非常好。我需要关闭()第一个队列/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"
脚本在暂停时从不打印“finished”,但似乎在队列中最后一项的“run\u this\u definition”结束时完成所有任务并暂停 我猜您使用的是
多处理.JoinableQueue()
!?使用Queue.Queue()
代替线程。它有一个.join()
和一个.task\u done()
。此外,您应该将队列作为参数传递给线程:请参见以下示例:
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"
来自多个线程的打印输出可能看起来很凌乱,但作为一个示例,它应该很好
对于未来:请提供一个全面的代码示例。您的示例中既没有定义导入,也没有定义
线程数
,运行此定义
或输入列表
。可能重复的伟大我将尝试此操作,并在上面添加代码的适当部分。谢谢。这样做会使错误工作者接受1给定的0个参数-我是否应该删除args=(jq,)部分?@AshleyA。哎呀。不,你应该允许你的员工进行辩论:)我修正了代码。没问题-谢谢!我尝试了此操作,但在完成输入列表中的最后一项后,仍然再次暂停。可能是一条线在某个地方停了下来?有没有办法检查当前正在运行的线程?@AshleyA-hmm那么在不了解更多代码的情况下,很难提供帮助。您可以使用threading.enumerate()
获取活动线程的列表。一般建议:尝试隔离您的问题。使用我的例子(我猜它对你有用?!),一步一步地添加代码,直到它开始停止。此外,使用打印
或更好的日志模块进行调试。