2010-11-02 28 views
1

J'essaye de construire un programme simple qui lancera une charge de processus, et si le processus principal est tué, les sous-processus mourront. Mon code ressemble à ceci:Problème avec python multitraitement 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) 

Cela fonctionne, mais si je supprime l'impression x sur la ligne 5, ce n'est pas le cas. Les processus continueront à fonctionner, pourquoi?

En outre, j'aimerais savoir si c'est la bonne manière de faire ce que j'essaye d'accomplir.

Répondre

1

Cela fonctionne bien pour moi dans 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')] 
... 

Êtes-vous utilisez Windows, peut-être? Il y a programming guidelines qui se rapportent à l'utilisation du multitraitement avec Windows. En particulier, vous devez fournir un point d'entrée en utilisant if __name__ == '__main__':.


Plus tard: en fait, il y a quelque chose que je ne comprends pas. Dans votre code d'origine, vous vous attendiez à tuer le parent des threads et à laisser les threads continuer à fonctionner. Comment avez-vous tué le parent - main() dans mon code? Et si les threads ne faisaient pas d'E/S, comment saviez-vous que les threads étaient encore en vie?


Et plus tard encore: Quand je lance les fils, je reçois ceci:

>>> 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')] 

et ceci:

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 

Et quand je tue le thread principal en python (Ctrl- C), je reçois ceci:

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 

Est-ce inexpec? ted ou indésirable?

+0

Salut hugh, en fait j'utilise Ubuntu 1004, En regardant le moniteur du système, j'ai remarqué qu'après avoir tué ce script les trois pid continueraient à fonctionner, ce que je veux éviter – MattyW

+0

ne fonctionne toujours pas pour moi, mais pour répondre à votre question, ce que je cherche est une façon propre d'avoir ces processus mourir quand le principal va – MattyW