2010-11-02 4 views
1

Я пытаюсь создать простую программу, которая сработает с нагрузкой процессов, а если основной процесс будет убит, подпроцессы умрут. Мой код выглядит так:Проблема с многопроцессорной обработкой 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) 

Это работает, но если я удалю печать x на линии 5, это не так. Почему процессы будут продолжать работать?

Кроме того, мне бы хотелось узнать, правильно ли это делается, чего я пытаюсь достичь.

ответ

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() в моем коде? И если потоки не выполняли ввода-вывода, как вы узнали, что потоки все еще живы?


А потом еще: Когда я запускаю нити, я получаю это:

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

И когда я убиваю основной поток в питона (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 

Является ли это неспециалистом или нежелательно?

+0

hi hugh, на самом деле я использую Ubuntu 1004, наблюдая за системным монитором, я заметил, что после того, как я убил этот скрипт, три pid продолжат работать, и это то, что я хочу избежать – MattyW

+0

все еще не работает для меня, но чтобы ответить на ваш вопрос, то, что я ищу, - это чистый способ, чтобы те процессы умирали, когда основной идет – MattyW

Смежные вопросы