Это отлично работает для меня в 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
Является ли это неспециалистом или нежелательно?
hi hugh, на самом деле я использую Ubuntu 1004, наблюдая за системным монитором, я заметил, что после того, как я убил этот скрипт, три pid продолжат работать, и это то, что я хочу избежать – MattyW
все еще не работает для меня, но чтобы ответить на ваш вопрос, то, что я ищу, - это чистый способ, чтобы те процессы умирали, когда основной идет –
MattyW