Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.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 JoinableQueue和队列线程未完成_Python_Multithreading - Fatal编程技术网

Python JoinableQueue和队列线程未完成

Python JoinableQueue和队列线程未完成,python,multithreading,Python,Multithreading,我正在使用下面的代码来完成一项任务,该任务使用多线程处理队列和可连接队列。有时脚本执行得非常完美,但有时它会在任务结束时暂停,而不会结束辅助进程,并且不会继续执行脚本的下一部分。我对使用Queue和JoinableQueue还不熟悉,我需要找出为什么会发生这种延迟 在代码的这一部分之前,我运行另一个队列JoinableQueue worker来下载一些数据,它每次都工作得非常好。我需要关闭()第一个队列/JoinableQueue中的任何东西吗?有没有办法检查它是否停止,如果是,继续 这是我的密

我正在使用下面的代码来完成一项任务,该任务使用多线程处理队列和可连接队列。有时脚本执行得非常完美,但有时它会在任务结束时暂停,而不会结束辅助进程,并且不会继续执行脚本的下一部分。我对使用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()
获取活动线程的列表。一般建议:尝试隔离您的问题。使用我的例子(我猜它对你有用?!),一步一步地添加代码,直到它开始停止。此外,使用
打印
或更好的日志模块进行调试。