Вопрос проверяет знание механизмов межпроцессного взаимодействия и умение выбирать подходящий IPC в зависимости от задачи.
IPC — это способы передачи данных между разными процессами. В Python чаще всего используют очереди и пайпы из multiprocessing, разделяемую память и сокеты. Очереди удобны для обмена сообщениями, разделяемая память — для быстрых числовых данных, сокеты — для взаимодействия между процессами на разных машинах. Выбор способа зависит от объёма данных, скорости и архитектуры приложения.
Процессы в Python имеют раздельную память, поэтому данные нельзя просто “передать по ссылке”, как между потоками.
Определение: IPC (Inter-Process Communication) — механизмы обмена данными и сигналами между независимыми процессами.
multiprocessing.Queue)Самый популярный и простой вариант.
Процессы кладут данные в очередь и читают из неё
Использует сериализацию (pickle)
from multiprocessing import Process, Queue
def worker(q):
q.put("data")
q = Queue()
p = Process(target=worker, args=(q,))
p.start()
print(q.get())
p.join()
Подходит:
Для передачи объектов Python
Для producer/consumer моделей
multiprocessing.Pipe)Двусторонний или односторонний канал связи.
Проще и быстрее очереди
Обычно используется между двумя процессами
Подходит:
Для простой связи “процесс ↔ процесс”
Позволяет нескольким процессам работать с одними и теми же данными.
multiprocessing.Value, Array
multiprocessing.shared_memory (для массивов и буферов)
Подходит:
Для больших числовых данных
Когда важна скорость и минимальные копирования
Используют сетевое взаимодействие.
Работают как между процессами на одной машине, так и по сети
Основа клиент-серверной архитектуры
Подходит:
Для распределённых систем
Для микросервисов
Самый простой, но медленный способ.
Процессы пишут и читают общее хранилище
Подходит:
Для простых сценариев
Когда высокая скорость не критична
Выбор обычно строится на следующих критериях:
Размер данных
Требования к скорости
Локальные или распределённые процессы
Простота реализации
Для большинства задач внутри одного приложения подходят Queue и Pipe.
Для высокопроизводительных сценариев лучше разделяемая память.
Для взаимодействия между сервисами — сокеты.