SmartQueryРазбор по существуРежимы по кругу: Система, Светлая, Тёмная. Enter или пробел переключают режим. Стрелки выбирают соседний, Home — Система, End — Тёмная.
Системы и инструменты

IPC: каналы, сокеты, сигналы и общая память

IPC — взаимодействие процессов: передача данных и согласование действий. Не каждый механизм работает между компьютерами. Например, локальный pipe или shared memory относятся к одной системе, а сетевой сокет может связывать разные машины. Сам факт обмена не решает все вопросы доставки, границ сообщений и прав.

Содержание статьи
  1. Чем различаются механизмы
  2. Пример Python: одно сообщение между процессами
  3. Условия, которые часто забывают

Чем различаются механизмы

МеханизмПодходит дляЧто нужно учесть
PipeПоток данных между связанными процессамиЗакрытие концов, EOF, буфер и блокировки
СокетЛокальный сервис или обмен по сетиТип сокета, протокол, framing, timeout и аутентификация
СигналУведомление о событии или управленииОграничения обработчика; это не канал произвольных больших объектов
Очередь сообщенийПередача отдельных сообщенийГраницы, порядок, лимиты и подтверждения зависят от реализации
Общая памятьСовместный доступ к массивам данныхСинхронизация и жизненный цикл; гонки не исчезают автоматически

Пример Python: одно сообщение между процессами

import multiprocessing as mp

def produce(connection):
    try:
        connection.send_bytes(b"ready")
    finally:
        connection.close()

if __name__ == "__main__":
    context = mp.get_context("spawn")
    receiver, sender = context.Pipe(duplex=False)
    worker = context.Process(target=produce, args=(sender,))
    worker.start()
    sender.close()
    try:
        if not receiver.poll(5):
            raise TimeoutError("No IPC message")
        print(receiver.recv_bytes(maxlength=32))
    finally:
        receiver.close()
        worker.join(timeout=5)
        if worker.is_alive():
            worker.terminate()
            worker.join()

Сохраните пример в отдельный .py-файл и запустите как программу; при spawn дочерний процесс должен импортировать функцию produce. Ожидаемый вывод — b'ready'. Это Connection-обёртка multiprocessing с сообщениями, а не обещание, что обычный POSIX pipe хранит границы произвольных записей.

Условия, которые часто забывают

  • Закрывайте неиспользуемые концы канала: оставшаяся открытая запись способна помешать обнаружить EOF.
  • Не передавайте чужие недоверенные данные в recv(), который восстанавливает Python-объекты через pickle. В примере выбраны bytes и явный лимит.
  • Продумайте выход при зависании и падении другой стороны. Timeout и cleanup должны иметь понятный смысл.
  • Измеряйте копирование, сериализацию и синхронизацию на своём объёме данных. Shared memory не является универсальным ускорителем для любого обмена.

Документация