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-07-30 20:04:28 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