Загрузка данных


"""
Лабораторная работа №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).")