多处理python 2.6的问题

时间:2010-11-02 15:01:01

标签: python multiprocessing

我正在尝试构建一个简单的程序,它将触发一大堆进程,如果主进程被终止,子进程将会死掉。我的代码如下所示:

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,它就不会。流程将继续运行,为什么?

此外,我很想知道这是否是我正在努力实现的正确方法。

1 个答案:

答案 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

这是意外还是不受欢迎?