python进程如何知道何时退出?

时间:2013-01-20 11:04:29

标签: python

执行python脚本时,进程/解释器是否退出,因为它从脚本中读取了EOF字符? [即是退出信号?]

对此的跟进是python子进程知道如何/何时退出,即当你通过覆盖run()方法启动子进程时,如下所示:

class Example(multiprocessing.Process):
    def __init__(self, task_queue, result_queue):
        multiprocessing.Process.__init__(self)
        self.task_queue = task_queue
        self.result_queue = result_queue

    def run(self):
        while True:
            next_task = self.task_queue.get()
            if next_task is None:
                print '%s: Exiting' % proc_name
                break
#more stuff...[assume there's some task_done stuff, etc]

if __name__ == '__main__':
    tasks = multiprocessing.JoinableQueue()
    results = multiprocessing.Queue()

    processes = [ Example(tasks, results)
                  for i in range(5) ]
    for i in processes:
        i.start()
#more stuff...like populating the queue, etc.

现在,我很好奇的是:子进程是否在run()方法完成后自动退出?如果我在执行期间杀死主线程,子进程会立即结束吗?如果他们的run()调用可以独立于父进程的状态完成,它们会结束吗?

1 个答案:

答案 0 :(得分:2)

是的,每个子进程在完成run方法后自动终止,即使我认为您应该避免继承Process并使用target参数。

请注意,在linux中,如果您没有读取退出状态,子进程可能会保持僵尸状态:

>>> from multiprocessing import Process
>>> def target():
...     print("Something")
... 
>>> Process(target=target).start()
>>> Something

>>> 

如果我们在此之后查看过程:

enter image description here

如果我们读取进程的退出状态(使用Process.exitcode),则不会发生这种情况。

每个Process实例在后台启动一个新进程,此子进程终止的方式和时间取决于操作系统。每个OS都提供了进程之间的一些通信方式。如果你杀死“父”进程,子进程通常终止。

例如,这样做:

>>> from multiprocessing import Process
>>> import time
>>> def target():
...     while True:
...             time.sleep(0.5)
... 
>>> L = [Process(target=target) for i in range(10)]
>>> for p in L: p.start()
... 

主要python进程将有10个孩子:

enter image description here

现在如果我们杀了那个过程,我们就得到了这个:

enter image description here 请注意子进程如何处理由init继承并仍在运行的位置。

但是,正如我所说,这是特定于操作系统的。在某些操作系统上,杀死父进程将终止所有子进程。