Учебный проект, разработанный в рамках дисциплины "Архитектуры компьютера и операционные системы".
Проект представляет собой клиент-серверное приложение на Python для конвертации изображений в черно-белый формат. Главная цель проекта — демонстрация работы архитектурного паттерна Producer-Consumer (Производитель-Потребитель) с использованием многопоточности и межпроцессного взаимодействия (IPC) через именованные каналы (Named Pipes) в среде Linux.
- Паттерн Producer-Consumer: Основной поток сервера принимает запросы и помещает их в потокобезопасную очередь (Producer). Заданный пул рабочих потоков (Consumers) извлекает задачи из очереди и обрабатывает их параллельно.
- Межпроцессное взаимодействие: Обмен данными реализован через механизмы ОС Linux — FIFO (именованные каналы, создаваемые в директории
/tmp). - Асинхронные ответы: Для каждого запроса клиент создает свой уникальный канал для ответа, что позволяет избежать гонки данных между разными сессиями.
- Обработка изображений: Конвертация RGB-пикселей в Grayscale осуществляется с помощью библиотеки
Pillow.
- ОС: Linux (проект использует специфичные для Unix системные вызовы, такие как
os.mkfifo). - Python: Версия 3.6 или выше.
- Зависимости:
Pillow(PIL).
Убедитесь, что у вас установлена необходимая библиотека для работы с графикой:
pip install PillowСервер инициализирует главный канал связи и запускает пул рабочих потоков (воркеров).
python3 server.py [имя_канала] [-w КОЛИЧЕСТВО_ВОРКЕРОВ]Параметры:
имя_канала (необязательно) — базовое имя для создания FIFO (по умолчанию: image_proc_channel).
-w, --workers (необязательно) — количество активных потоков для обработки изображений (по умолчанию: 3).
##Пример запуска сервера с 5 потоками:
python3 server.py my_channel -w 5#Запуск клиента
python3 client.py [имя_канала]##Как это работает (Архитектура)
Server: Создает общий request pipe (например, /tmp/image_proc_channel.req.pipe). Принимает строку вида путь_к_файлу:путь_к_каналу_ответа и кладет эту задачу в queue.Queue(). Воркеры забирают пути из очереди, конвертируют картинку (с искусственной задержкой для эмуляции тяжелой задачи) и отправляют статус завершения обратно.
Client: Читает ввод пользователя, генерирует уникальный response pipe (например, /tmp/resp_1234_1.pipe) и передает его серверу. После отправки задачи клиент блокируется в ожидании ответа из своего персонального канала, читает результат и удаляет временный канал.