执行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()调用可以独立于父进程的状态完成,它们会结束吗?
答案 0 :(得分:2)
是的,每个子进程在完成run
方法后自动终止,即使我认为您应该避免继承Process
并使用target
参数。
请注意,在linux中,如果您没有读取退出状态,子进程可能会保持僵尸状态:
>>> from multiprocessing import Process
>>> def target():
... print("Something")
...
>>> Process(target=target).start()
>>> Something
>>>
如果我们在此之后查看过程:
如果我们读取进程的退出状态(使用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个孩子:
现在如果我们杀了那个过程,我们就得到了这个:
请注意子进程如何处理由init
继承并仍在运行的位置。
但是,正如我所说,这是特定于操作系统的。在某些操作系统上,杀死父进程将终止所有子进程。