2

Я новичок в многопроцессорной работе, может ли кто-нибудь сказать мне, почему это не дает никакого вывода?Нет результата процесса с использованием многопроцессорности

import multiprocessing 

def worker(num): 
    """thread worker function""" 

    print('Worker:', num) 

if __name__ == '__main__': 
    jobs = [] 

    for i in range(4): 
     p = multiprocessing.Process(target=worker, args=(i,)) 
     jobs.append(p) 
     p.start() 
+0

[Кажется, работает хорошо.] (Https://ideone.com/jT84Ar) –

+0

ли вы запустить свой код в интерактивном режиме или в качестве сценария (например, 'питон myscript.py')? – robyschek

+0

работает как скрипт работает. – user128751

ответ

0

Возможно, вам необходимо вымыть выход. Вы можете использовать sys.stdout.flush():

import multiprocessing 
import sys 

def worker(num): 
    """thread worker function""" 
    print('Worker:', num) 
    sys.stdout.flush() 
    return 

if __name__ == '__main__': 
    jobs = [] 
    for i in range(4): 
     p = multiprocessing.Process(target=worker, args=(i,)) 
     jobs.append(p) 
     p.start() 
+0

Это не помогло! – user128751

+0

Вы можете попробовать поместить его в цикл for или after - для меня это работает без флеша. – rofls

+0

@ user128751 как вы управляете программой? Терминал, интерпретатор, IDE? – rofls

1

Вы начинаете свой 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) вывод выводится на консоль, как указано выше.

+0

работает как скрипт, но с использованием IDLE он не работает. – user128751

+0

Странная вещь. В ipython, когда я запускаю код ** с соединением ** после ** кода без соединения **, отсутствующие сообщения из ** кода без соединения ** также очищаются. Так что речь идет не о преждевременном выходе, а о кешировании stdout в ipython. – robyschek

+0

Нашли его, см. Мое редактирование! – Will