Ответ
Многопроцессорность в Python используется для выполнения CPU-bound задач, так как она позволяет обойти ограничение Global Interpreter Lock (GIL), запуская код в отдельных процессах с собственным интерпретатором и памятью. Основным инструментом является модуль multiprocessing.
Ключевые компоненты multiprocessing:
1. Класс Process
Создает и управляет отдельным процессом. Аналогичен threading.Thread.
from multiprocessing import Process
import os
def info(title):
print(title)
print('parent process:', os.getppid())
print('process id:', os.getpid())
if __name__ == '__main__':
p = Process(target=info, args=('Функция info',))
p.start()
p.join()
2. Класс Pool
Управляет пулом рабочих процессов, что удобно для распараллеливания выполнения функции на наборе данных (задачи в стиле map-reduce).
from multiprocessing import Pool
def square(x):
return x * x
if __name__ == '__main__':
# Создаем пул из 4 процессов
with Pool(processes=4) as pool:
# Распределяем вычисления по процессам
results = pool.map(square, range(10))
print(results)
3. Средства межпроцессного взаимодействия (IPC) Поскольку процессы не разделяют память, для обмена данными нужны специальные механизмы:
Queue: Процессно-безопасная очередь (FIFO).Pipe: Двусторонний канал связи между двумя процессами.
Пример с Queue:
from multiprocessing import Process, Queue
def worker(q):
q.put([42, None, 'hello'])
if __name__ == '__main__':
q = Queue()
p = Process(target=worker, args=(q,))
p.start()
print(q.get()) # Блокируется до получения данных
p.join()
4. Разделяемая память Для обмена простыми данными без сериализации можно использовать:
Value: Разделяемый объект для одного значения (например,c_int,c_double).Array: Разделяемый массив фиксированного размера и типа.