Python 2.6 中的多进程问题
我正在尝试构建一个简单的程序,这个程序会启动很多子进程,如果主进程被杀掉,子进程也会随之结束。我的代码是这样的:
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行的print x去掉,它就不行了。子进程会继续运行,为什么呢?
另外,我也想知道这样做是否是我想要实现目标的正确方法。
1 个回答
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呢?关于在Windows上使用多进程,有一些编程指南。特别是,你需要通过使用if __name__ == '__main__':
来提供一个入口点。
后来:其实,有些地方我不太明白。在你最开始的代码中,你希望能结束线程的父进程,但让线程继续运行。你是怎么结束父进程的——在我的代码中是main()
吗?如果线程没有进行任何输入输出操作,你是怎么知道线程还在运行的呢?
再后来:当我运行线程时,我得到了这个:
>>> 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
这是意料之外的情况吗?或者说是不好的结果吗?