«Многопроцессорная печать не работает» – решения и примеры кода
При работе с многопроцессорностью в 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())