Решения для печати при многопроцессорной обработке на Python

«Многопроцессорная печать не работает» – решения и примеры кода

При работе с многопроцессорностью в Python вы можете столкнуться с ситуациями, когда используется стандартный print

Метод 1: использование блокировок
Один из способов обеспечить упорядоченную печать — использовать блокировки из модуля multiprocessing. Вот пример:

import multiprocessing as mp
def print_with_lock(msg, lock):
    with lock:
        print(msg)
if __name__ == '__main__':
    lock = mp.Lock()
    processes = []
    for i in range(5):
        p = mp.Process(target=print_with_lock, args=(f"Message {i}", lock))
        p.start()
        processes.append(p)
    for p in processes:
        p.join()

Метод 2: перенаправление вывода
Другой подход заключается в перенаправлении вывода каждого процесса в отдельные файлы. Вот пример:

import multiprocessing as mp
import sys
def print_to_file(msg):
    print(msg)
if __name__ == '__main__':
    sys.stdout = open('output.txt', 'w')
    processes = []
    for i in range(5):
        p = mp.Process(target=print_to_file, args=(f"Message {i}",))
        p.start()
        processes.append(p)
    for p in processes:
        p.join()
    sys.stdout.close()
    sys.stdout = sys.__stdout__

Метод 3: использование очереди
Третий метод предполагает использование multiprocessing.Queueдля сбора выходных данных различных процессов и их последовательной печати. Вот пример:

import multiprocessing as mp
def print_to_queue(msg, queue):
    queue.put(msg)
if __name__ == '__main__':
    queue = mp.Queue()
    processes = []
    for i in range(5):
        p = mp.Process(target=print_to_queue, args=(f"Message {i}", queue))
        p.start()
        processes.append(p)
    for p in processes:
        p.join()
    while not queue.empty():
        print(queue.get())