"""
Лабораторная работа №8
Тема: IPC – взаимодействие процессов
"""
import multiprocessing
import time
import os
# ============================================================
# 1. ОБМЕН ДАННЫМИ ЧЕРЕЗ PIPE
# ============================================================
print("1. Обмен через Pipe")
def sender(conn):
messages = ["Привет", "Как дела?", "Пока"]
for msg in messages:
print(f"Отправитель (PID {os.getpid()}): {msg}")
conn.send(msg)
time.sleep(0.3)
conn.close()
def receiver(conn):
while True:
try:
msg = conn.recv()
print(f"Получатель (PID {os.getpid()}): {msg}")
if msg == "Пока":
break
except EOFError:
break
parent_conn, child_conn = multiprocessing.Pipe()
p1 = multiprocessing.Process(target=sender, args=(parent_conn,))
p2 = multiprocessing.Process(target=receiver, args=(child_conn,))
p1.start()
p2.start()
p1.join()
p2.join()
print("Pipe завершён\n")
# ============================================================
# 2. ОЧЕРЕДЬ СООБЩЕНИЙ (QUEUE)
# ============================================================
print("2. Очередь сообщений (Queue)")
def producer(q):
for i in range(5):
msg = f"Сообщение {i+1}"
print(f"Производитель: отправил {msg}")
q.put(msg)
time.sleep(0.2)
q.put(None) # сигнал остановки
def consumer(q):
while True:
msg = q.get()
if msg is None:
break
print(f"Потребитель: получил {msg}")
time.sleep(0.1)
q = multiprocessing.Queue()
prod = multiprocessing.Process(target=producer, args=(q,))
cons = multiprocessing.Process(target=consumer, args=(q,))
prod.start()
cons.start()
prod.join()
cons.join()
print("Queue завершён\n")
# ============================================================
# 3. СРАВНЕНИЕ (коротко)
# ============================================================
print("3. Сравнение Pipe и Queue")
print("- Pipe: только 2 процесса, простой, быстрый")
print("- Queue: много процессов, удобный, автоматическая синхронизация")
print("- Ограничения Pipe: только два участника")
print("- Ограничения Queue: размер буфера, сериализация")
# ============================================================
# ВЫВОД
# ============================================================
print("\nВывод:")
print("Pipe подходит для связи двух процессов.")
print("Queue подходит для сценариев с множеством процессов (producer-consumer).")