Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.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_Multiprocessing - Fatal编程技术网

Python 子进程已完成,但父进程挂起

Python 子进程已完成,但父进程挂起,python,multiprocessing,Python,Multiprocessing,我有一个应用程序可以启动子进程(目前为64个)并执行一些工作。 每个进程大约45分钟后结束,但不知何故父进程似乎挂起了,因为父进程没有退出并挂起在联接循环中 我开始这样的过程: def worker(out_q): # do something that takes a lot of time print('done working') sys.exit(0) def main(): procs = [] out_q = Queue() for

我有一个应用程序可以启动子进程(目前为64个)并执行一些工作。 每个进程大约45分钟后结束,但不知何故父进程似乎挂起了,因为父进程没有退出并挂起在联接循环中

我开始这样的过程:

def worker(out_q):
    # do something that takes a lot of time
    print('done working')
    sys.exit(0)

def main():
    procs = []
    out_q = Queue()

    for i in range(opt.num_threads):
        sys.stdout.write("\r\tStarting Worker Process: %d" %(i+1))
        sys.stdout.flush()
        p = multiprocessing.Process(target=worker, args=(out_q,))
        procs.append(p)
        p.start()

     #then i wait for all processes to finish:

    try:
        for i, p in enumerate(procs):
            print("waiting for process %d" %i)
            p.join()
            print("process %d joined" %i)
    except KeyboardInterrupt as e:
        sys.exit(0)
if __name__ == "__main__":
    main()
我看到的唯一输出是
等待进程0
,在所有进程完成后(我看到所有进程都说
完成工作
),进程列表中仍有所有64个进程,并且父进程未完成。 父进程似乎挂起了,因为任务管理器无法终止它


如何调试该进程或需要终止该进程?为什么在调用子进程内的sys.exit(0)后,该进程不会从进程列表中删除?

这可能不是挂起的直接原因

您需要将参数作为tuple
(out\u q,)
或作为list
[out\u q]
传递

p = multiprocessing.Process(target=worker, args=(out_q,))
#                                                ^^^^^^^

您不应该在
worker
函数中执行
退出(0)
。这会在子进程有机会向父进程报告成功之前终止子进程。换句话说,子进程在调用
task\u done()
之前终止,因此
p.join()
将永远等待。

啊,不,这只是一个复制粘贴错误…工作程序有更多参数,我将它们分条。如果运行时间较短,整个过程都会工作。因此,此问题只会在长运行时发生>10min@reox,您是否使用
来保护与多进程相关的代码,如果uuu name\uuuuuu='\uuuuu main\uuuuuu':..
?是的,我将附加在我发布的代码中找到。但是工作进程没有被杀死-我可以在procexplorer中看到进程映像。即使我没有执行sys.exit(0),父进程仍挂起在该循环中…我将在没有sys.exit(0)的情况下重试-可能需要一段时间while@reox:为什么不测试您的多处理代码,注释掉耗时的部分?因为这样一切都可以正常工作;)正如所说:只有让它运行一段时间,问题才会出现。我考虑了一个耗时部分的问题,但是当每个过程都结束并报告它已经完成时,我认为问题不在那里,所以我再次测试了它。每个进程都打印出它已经完成,但是循环总是等待第一个进程加入。工作人员是否在
out\u q
?你在排队吗?是的,他们在排队。我在这里看到了这个,我现在检查队列有多满,并尝试实现队列刷新。。。