我正在尝试构建一个简单的程序,它将触发一大堆进程,如果主进程被终止,子进程将会死掉。我的代码如下所示:
import time
def test_proc(name, conn):
x = 0
while True:
print x
x += 1
conn.poll()
from multiprocessing import Process, Pipe
proc_name= ['a', 'b', 'c']
procs = []
for p in proc_name:
parent_conn, child_conn = Pipe()
p = Process(target=test_proc, args=(p, child_conn))
procs.append(p)
p.start()
while True:
print [(p.is_alive(), 'Pid %s' %(p.pid)) for p in procs]
time.sleep(1)
它可以工作,但如果我在第5行删除了打印x,它就不会。流程将继续运行,为什么?
此外,我很想知道这是否是我正在努力实现的正确方法。
答案 0 :(得分:1)
这在Ubuntu中对我来说很好用:
>>> from time import sleep
>>> from multiprocessing import Process, Pipe
>>>
>>> def test_proc(name, conn):
... x = 0
... while True:
... #print x
... x += 1
... conn.poll()
...
>>> def main():
... proc_name= ['a', 'b', 'c']
... procs = [Process(target=test_proc, args=Pipe()) for p in proc_name]
... for p in procs:
... p.start()
... while True:
... print [(p.is_alive(), 'Pid %s' %(p.pid)) for p in procs]
... sleep(1)
...
>>> main()
[(True, 'Pid 423'), (True, 'Pid 424'), (True, 'Pid 425')]
[(True, 'Pid 423'), (True, 'Pid 424'), (True, 'Pid 425')]
[(True, 'Pid 423'), (True, 'Pid 424'), (True, 'Pid 425')]
[(True, 'Pid 423'), (True, 'Pid 424'), (True, 'Pid 425')]
...
你在使用Windows吗?有programming guidelines与使用Windows进行多处理有关。特别是,您需要使用if __name__ == '__main__':
提供入口点。
后来:实际上,有些东西我没有得到。在原始代码中,您希望杀死线程的父级并让线程继续运行。你是如何在我的代码中杀死父母main()
的?如果线程没有执行I / O,你怎么知道线程还活着?
后来还是:当我运行线程时,我得到了这个:
>>> main()
[(True, 'Pid 940'), (True, 'Pid 941'), (True, 'Pid 942')]
[(True, 'Pid 940'), (True, 'Pid 941'), (True, 'Pid 942')]
[(True, 'Pid 940'), (True, 'Pid 941'), (True, 'Pid 942')]
[(True, 'Pid 940'), (True, 'Pid 941'), (True, 'Pid 942')]
[(True, 'Pid 940'), (True, 'Pid 941'), (True, 'Pid 942')]
和此:
PID TTY TIME CMD
911 pts/6 00:00:00 python
940 pts/6 00:00:29 python
941 pts/6 00:00:29 python
942 pts/6 00:00:37 python
944 pts/5 00:00:00 ps
当我在python(Ctrl-C)中杀死主线程时,我得到了这个:
PID TTY TIME CMD
911 pts/6 00:00:00 python
940 pts/6 00:00:42 python <defunct>
941 pts/6 00:00:50 python <defunct>
942 pts/6 00:00:51 python <defunct>
946 pts/5 00:00:00 ps
这是意外还是不受欢迎?