Многопроцессорная обработка Python: print () внутри apply_async () - PullRequest
0 голосов
/ 29 мая 2019

print () внутри функции, которая передается многопроцессорной функции apply_async (), ничего не печатает.

Я хочу в конечном итоге применить apply_async для обработки большого текстового файла в виде кусков.Поэтому я хочу, чтобы скрипт выводил на экран, сколько строк было обработано.Однако я не вижу никаких отпечатков.

Я прикрепил игрушечный код.Каждый вызов foo () должен сообщать мне, какой процесс используется.В моем реальном коде я буду вызывать foo () для каждого чанка, и он скажет мне, сколько строк текста в этом чанке я обработал.

import os
from multiprocessing import Pool

def foo(x,y):
    print(f'Process: {os.getpid()}')
    return(x*y)

def bar(x):
    p = Pool()
    result_list = []
    for i in range(30):
        p.apply_async(foo, args=(i,i*x), callback=result_list.append)
    p.close()
    p.join()
    return(result_list)

if __name__ == '__main__':
    print(bar(2))

Я получил распечатку из умноженияx * y результат, но я не увидел ни одной распечатки, которая бы указывала мне идентификатор процесса.

Может кто-нибудь помочь мне, пожалуйста?

1 Ответ

0 голосов
/ 29 мая 2019

Ваш sys.stdout, вероятно, буферизован блоком, что означает, что небольшое количество print s может быть буферизовано без заполнения буфера (и, следовательно, буфер никогда не сбрасывается на экран / файл).Обычно Python сбрасывает буферы при выходе, так что это не проблема.

Проблема в том, чтобы избежать кучки хитрых проблем с двойной очисткой, при использовании multiprocessing рабочие выходят , используяos._exit, который обходит все процедуры очистки (включая очистку буферов stdio).Если вы хотите убедиться, что выходной сигнал выдан, скажите print немедленно очистить выход, изменив:

print(f'Process: {os.getpid()}')

на:

print(f'Process: {os.getpid()}', flush=True)
...