【问题标题】:why python join zombie processes when starting a new one?为什么python在启动一个新进程时会加入僵尸进程?
【发布时间】:2015-05-10 10:15:20
【问题描述】:

为什么当我创建一个进程并且我有 n 处于僵尸状态 python 的孩子加入他们?

In [1]: def quick_process():
...:     pass
...: 
In [2]: import multiprocessing
In [3]: import time
In [4]: for i in range(5):
...:     multiprocessing.Process(target=quick_process).start()
...:     time.sleep(1)
...:
In [5]: import os
In [6]: while True:
...:     try:
...:         pid, status = os.waitpid(-1, 0)
...:         print(pid, status)
...:     except ChildProcessError:
...:         break
...:     
5767 0

time.sleep(1) 语句用于确保当我再次循环时进程处于僵尸状态,仅此而已。如您所见,while 执行时只剩下一个孩子。在这个例子中n = 1,但它也会出现更大的值。为什么python会这样做?我不应该明确加入这些流程吗?谁能告诉我这里发生了什么?谢谢

【问题讨论】:

  • 为什么不应该多处理等待孩子?这是一个高级界面,用户不应该被低级的东西所困扰。
  • 我认为你的进程根本不是僵尸;相反。为了让他们成为僵尸,请将pass 替换为while True: pass
  • 因为当我加入这些孩子时,我需要对他们做一些事情,并且通过启动新流程,我不会注意到他们何时完成
  • 一个进程在它完成并且它的父进程没有加入他时成为僵尸,所以那些进程是僵尸

标签: python python-multiprocessing


【解决方案1】:

Python 不加入进程。执行quick_process 时进程退出。您仍然可以join 之后的进程,如果进程已经终止,它将立即返回。示例:

import multiprocessing

def quick_process():
    pass

processes = []
for _ in range(5):
    p = multiprocessing.Process(target=quick_process)
    p.start()
    processes.append(p)

for p in processes:
    p.join()  # returns when the process terminates

【讨论】:

    猜你喜欢
    • 2013-04-11
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    • 2013-06-18
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    相关资源
    最近更新 更多