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