2012-08-13 105 views
11

我预计terminate()方法杀死两个过程:为什么孩子们不会死?

import multiprocessing 
import time 

def foo(): 
    while True: 
     time.sleep(1) 

def bar(): 
    while True: 
     time.sleep(1) 

if __name__ == '__main__': 
    while True: 
     p_foo = multiprocessing.Process(target=foo, name='foo') 
     p_bar = multiprocessing.Process(target=bar, name='bar') 
     p_foo.start() 
     p_bar.start() 
     time.sleep(1) 
     p_foo.terminate() 
     p_bar.terminate() 
     print p_foo 
     print p_bar 

运行代码给出:

<Process(foo, started)> 
<Process(bar, started)> 
<Process(foo, started)> 
<Process(bar, started)> 
... 

我期待:

<Process(foo, stopped)> 
<Process(bar, stopped)> 
<Process(foo, stopped)> 
<Process(bar, stopped)> 
... 
+17

对于漂亮的头部线条+1。可能是重金属记录的标题。 – log0 2012-08-13 21:39:46

+4

多重处理总是会让这些关于垂死的孩子变成僵尸,杀死他们的父母和东西的非常棒的评论。这真是太棒了 – poke 2012-08-13 21:43:48

回答

7

因为terminate功能只需发送SIGTERM信号处理,但signals are asynchronous,所以你可以睡一段时间,或wait用于进程终止(信号接收)。

例如,如果在终止后添加字符串time.sleep(.1),它可能会被终止。