masyasmv / otus_moving_objects_multithreaded
Домашнее задание Многопоточное выполнение команд
Installs: 0
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
Open Issues: 0
pkg:composer/masyasmv/otus_moving_objects_multithreaded
Requires
- php: ^8.3
- ext-parallel: *
Requires (Dev)
- phpunit/phpunit: ^12.1
This package is auto-updated.
Last update: 2025-10-30 20:35:52 UTC
README
Manager — это простая и расширяемая реализация диспетчера команд для параллельного (многопоточного) выполнения. Подходит для учебного проекта «Космический бой»: вы можете создавать команды, добавлять их в очередь и управлять жизненным циклом рабочих потоков.
📋 Содержание
Обзор проекта
Класс Manager:
- 
Создаёт пул Nпотоков (runtime), каждый из которых слушает канал команд.
- 
Позволяет динамически добавлять объекты, реализующие CommandInterface, в очередь.
- 
Обрабатывает команды параллельно, безопасно перехватывая любые исключения. 
- 
Предоставляет два способа остановки: - Soft stop — дожидается завершения всех запущенных команд (грейсфул-остановка).
- Hard stop — немедленно прерывает работу потоков.
 
Пример использования: игра «Космический бой», где каждый выстрел или обработка физики представлена командой.
Особенности
- Многопоточность на базе расширения ext-parallel
- Потокобезопасная очередь на основе Channel
- Грейсфул и форсированная остановка рабочих потоков
- Лёгкая интеграция новых видов команд через единый интерфейс
- Юнит-тесты для проверки базовых сценариев
Требования
- PHP ≥ 8.1
- Расширение parallel
- Composer
Установка
git clone https://github.com/MasyaSmv/otus_moving_objects_multithreaded.git
cd otus_moving_objects_multithreaded
composer install
Использование
Запуск Manager
use Masyasmv\Multithreaded\Manager; $manager = new Manager(4); // создаём 4 рабочих потока
Метод enqueue
Добавляет команду в очередь на исполнение:
$manager->enqueue(new MyCommand(...));
Каждая команда должна реализовать интерфейс:
namespace Masyasmv\Multithreaded\Contracts; interface CommandInterface { public function execute(): void; }
Soft Stop
Мягкая остановка: дожидается завершения всех запущенных команд.
$manager->softStop();
Hard Stop
Форсированная остановка: немедленно закрывает каналы и завершает потоки.
$manager->hardStop();
Интеграция новых команд
- 
Реализуйте свой класс команды: class ShootCommand implements CommandInterface { public function execute(): void { // логика выстрела } } 
- 
Добавьте в менеджер: $manager->enqueue(new ShootCommand()); 
- 
При softStop()дожидается завершения всех выстрелов, приhardStop()— мгновенно останавливается.
Тестирование
В проекте настроены PHPUnit-тесты:
vendor/bin/phpunit --colors=always
Покрыты сценарии:
- Запуск нужного количества потоков
- Soft Stop с ожиданием выполнения
- Hard Stop с немедленной остановкой
Архитектура
- Manager — центральный класс, создаёт каналы и потоки, управляет жизненным циклом.
- Channel — потокобезопасная очередь из ext-parallel.
- Runtime — отдельный PHP-поток, выполняющий замыкание-воркер.
- Future — объект, отслеживающий завершение воркера.
Лицензия
MIT © MasyaSmv