【问题标题】:Subprocesses finished but parent process hung up [duplicate]子进程完成但父进程挂起[重复]
【发布时间】:2014-02-19 14:25:28
【问题描述】:

我有一个启动子进程(当前为 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()

我看到的唯一输出是waiting for process 0,并且在所有进程都完成之后(我看到所有进程都说done working,进程列表中仍然有所有64个进程并且父进程没有完成。 父进程好像挂了,因为不能被任务管理器杀死。

我该如何调试或者我需要终止进程?为什么在子进程内部调用 sys.exit(0) 后进程没有从进程列表中删除?

【问题讨论】:

  • 工人是否在out_q 中放了一些东西?你消耗队列吗?
  • 是的。我在这里看到了这个bugs.python.org/issue8237 我现在检查队列有多满并尝试实现队列刷新...

标签: python multiprocessing


【解决方案1】:

您不应该在worker 函数中使用exit(0)。这会在您的子进程有机会向父进程报告成功之前杀死它。换句话说,子进程在调用task_done() 之前被杀死,因此p.join() 将永远等待。

【讨论】:

  • 但是工人没有被杀死——我可以在 procexplorer 中看到进程映像。即使我不执行 sys.exit(0),父进程也会在该循环中挂起......我会在没有 sys.exit(0) 的情况下重试 - 可能需要一段时间
  • @reox:你为什么不测试你的多处理代码,把耗时的部分注释掉?
  • 因为一切正常;)正如所说:问题只有在我让它运行一段时间时才会出现。我想到了耗时部分的问题,但是随着每个过程都到达终点并报告已完成,我认为问题不存在
  • 所以我再次测试了它。每个进程都打印出它已完成,但循环总是等待第一个进程加入
【解决方案2】:

这可能不是挂断的直接原因。

您需要将参数作为元组(out_q,) 或列表[out_q] 传递。

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

【讨论】:

  • 啊不,这只是一个复制和粘贴错误......工人有更多的论据,我把它们删掉了。如果运行时间更短,那么整个事情都会起作用。所以这个问题只发生在长时间运行> 10分钟
  • @reox,您是否使用if __name__ == '__main__': .. 保护与多进程相关的代码?
  • 是的,我会将其附加到我发布的代码中。
猜你喜欢
  • 2014-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-17
  • 2017-02-28
相关资源
最近更新 更多