Python 2.6 中的多进程问题

1 投票
1 回答
1835 浏览
提问于 2025-04-16 06:26

我正在尝试构建一个简单的程序,这个程序会启动很多子进程,如果主进程被杀掉,子进程也会随之结束。我的代码是这样的:

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

这是意料之外的情况吗?或者说是不好的结果吗?

撰写回答