masyasmv/otus_moving_objects_multithreaded

There is no license information available for the latest version (dev-main) of this package.

Домашнее задание Многопоточное выполнение команд

dev-main 2025-07-30 19:43 UTC

This package is auto-updated.

Last update: 2025-07-30 20:04:28 UTC


README

Manager — это простая и расширяемая реализация диспетчера команд для параллельного (многопоточного) выполнения. Подходит для учебного проекта «Космический бой»: вы можете создавать команды, добавлять их в очередь и управлять жизненным циклом рабочих потоков.

📋 Содержание

  1. Обзор проекта

  2. Особенности

  3. Требования

  4. Установка

  5. Использование

  6. Интерфейс команд

  7. Тестирование

  8. Архитектура

  9. Вклад в проект

  10. Лицензия

Обзор проекта

Класс 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();

Интеграция новых команд

  1. Реализуйте свой класс команды:

    class ShootCommand implements CommandInterface
    {
        public function execute(): void {
            // логика выстрела
        }
    }
  2. Добавьте в менеджер:

    $manager->enqueue(new ShootCommand());
  3. При softStop() дожидается завершения всех выстрелов, при hardStop() — мгновенно останавливается.

Тестирование

В проекте настроены PHPUnit-тесты:

vendor/bin/phpunit --colors=always

Покрыты сценарии:

  • Запуск нужного количества потоков
  • Soft Stop с ожиданием выполнения
  • Hard Stop с немедленной остановкой

Архитектура

  • Manager — центральный класс, создаёт каналы и потоки, управляет жизненным циклом.
  • Channel — потокобезопасная очередь из ext-parallel.
  • Runtime — отдельный PHP-поток, выполняющий замыкание-воркер.
  • Future — объект, отслеживающий завершение воркера.

Лицензия

MIT © MasyaSmv