Вы начинаете свой Process()
, но никогда не ожидая от него, чтобы закончить, поэтому выполнение вашей программы заканчивается до завершения процесса фона. Попробуйте это, с вызовом Process.join()
:
import multiprocessing
import sys
def worker(num):
"""thread worker function"""
print('Worker:', num)
sys.stdout.flush()
if __name__ == '__main__':
jobs = []
for i in range(4):
p = multiprocessing.Process(target=worker, args=(i,))
jobs.append(p)
p.start()
map(lambda p: p.join(), jobs)
Здесь мы используем map()
называть join()
по каждому процессу в jobs
списке.
Вот пример этой работы:
In [127]: %paste
import multiprocessing
import sys
def worker(num):
"""thread worker function"""
print('Worker:', num)
sys.stdout.flush()
if __name__ == '__main__':
jobs = []
for i in range(4):
p = multiprocessing.Process(target=worker, args=(i,))
jobs.append(p)
p.start()
map(lambda p: p.join(), jobs)
## -- End pasted text --
Worker: 2
Worker: 1
Worker: 0
Worker: 3
In [128]:
А почему это не работает на холостом ходу, см this answer:
Однако, чтобы увидеть print
выход, по крайней мере, на Windows, , нужно запустить IDLE с консоли, как показано на рисунке.
C:\Users\Terry>python -m idlelib
hello bob
(Использование idlelib.idle
на 2.x.) Причина заключается в том, что IDLE работает код пользователя в отдельном процессе. В настоящее время соединение между процессом IDLE и процессом пользовательского кода осуществляется через сокет. Вилка, выполняемая многопроцессорной обработкой, не дублирует и не наследует соединение сокета. Когда IDLE запускается с помощью значка или проводника (в Windows), выход печати некуда. При запуске с консоли с python
(а не pythonw
) вывод выводится на консоль, как указано выше.
[Кажется, работает хорошо.] (Https://ideone.com/jT84Ar) –
ли вы запустить свой код в интерактивном режиме или в качестве сценария (например, 'питон myscript.py')? – robyschek
работает как скрипт работает. – user128751