PHPackages                             masyasmv/otus\_moving\_objects\_multithreaded - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. masyasmv/otus\_moving\_objects\_multithreaded

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

masyasmv/otus\_moving\_objects\_multithreaded
=============================================

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

00PHPCI passing

Since Jul 28Pushed 9mo agoCompare

[ Source](https://github.com/MasyaSmv/otus_moving_objects_multithreaded)[ Packagist](https://packagist.org/packages/masyasmv/otus_moving_objects_multithreaded)[ RSS](/packages/masyasmv-otus-moving-objects-multithreaded/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependenciesVersions (2)Used By (0)

Manager — многопоточная система выполнения команд
=================================================

[](#manager--многопоточная-система-выполнения-команд)

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

---

📋 Содержание
------------

[](#-содержание)

1. [Обзор проекта](#%D0%BE%D0%B1%D0%B7%D0%BE%D1%80-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0)
2. [Особенности](#%D0%BE%D1%81%D0%BE%D0%B1%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8)
3. [Требования](#%D1%82%D1%80%D0%B5%D0%B1%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)
4. [Установка](#%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0)
5. [Использование](#%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)

    - [Запуск Manager](#%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA-manager)
    - [Метод `enqueue`](#%D0%BC%D0%B5%D1%82%D0%BE%D0%B4-enqueue)
    - [Soft Stop](#soft-stop)
    - [Hard Stop](#hard-stop)
6. [Интерфейс команд](#%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81-%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4)
7. [Тестирование](#%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)
8. [Архитектура](#%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0)
9. [Вклад в проект](#%D0%B2%D0%BA%D0%BB%D0%B0%D0%B4-%D0%B2-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82)
10. [Лицензия](#%D0%BB%D0%B8%D1%86%D0%B5%D0%BD%D0%B7%D0%B8%D1%8F)

---

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

[](#обзор-проекта)

Класс **Manager**:

- Создаёт пул `N` потоков (runtime), каждый из которых слушает канал команд.
- Позволяет динамически добавлять объекты, реализующие `CommandInterface`, в очередь.
- Обрабатывает команды параллельно, безопасно перехватывая любые исключения.
- Предоставляет два способа остановки:

    - **Soft stop** — дожидается завершения всех запущенных команд (грейсфул-остановка).
    - **Hard stop** — немедленно прерывает работу потоков.

Пример использования: игра «Космический бой», где каждый выстрел или обработка физики представлена командой.

Особенности
-----------

[](#особенности)

- **Многопоточность** на базе расширения `ext-parallel`
- **Потокобезопасная очередь** на основе `Channel`
- **Грейсфул и форсированная остановка** рабочих потоков
- **Лёгкая интеграция** новых видов команд через единый интерфейс
- **Юнит-тесты** для проверки базовых сценариев

Требования
----------

[](#требования)

- PHP ≥ 8.1
- Расширение [`parallel`](https://www.php.net/manual/ru/book.parallel.php)
- Composer

Установка
---------

[](#установка)

```
git clone https://github.com/MasyaSmv/otus_moving_objects_multithreaded.git
cd otus_moving_objects_multithreaded
composer install
```

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

[](#использование)

### Запуск Manager

[](#запуск-manager)

```
use Masyasmv\Multithreaded\Manager;

$manager = new Manager(4);  // создаём 4 рабочих потока
```

### Метод `enqueue`

[](#метод-enqueue)

Добавляет команду в очередь на исполнение:

```
$manager->enqueue(new MyCommand(...));
```

Каждая команда должна реализовать интерфейс:

```
namespace Masyasmv\Multithreaded\Contracts;

interface CommandInterface
{
    public function execute(): void;
}
```

### Soft Stop

[](#soft-stop)

Мягкая остановка: дожидается завершения всех запущенных команд.

```
$manager->softStop();
```

### Hard Stop

[](#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

###  Health Score

16

—

LowBetter than 5% of packages

Maintenance43

Moderate activity, may be stable

Popularity0

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity15

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://www.gravatar.com/avatar/f29a405df86487468d199f9525b44185d3bd3a81ccca962f75e0517a9ea44682?d=identicon)[MasyaSmv](/maintainers/MasyaSmv)

---

Top Contributors

[![MasyaSmv](https://avatars.githubusercontent.com/u/61746307?v=4)](https://github.com/MasyaSmv "MasyaSmv (17 commits)")

### Embed Badge

![Health badge](/badges/masyasmv-otus-moving-objects-multithreaded/health.svg)

```
[![Health](https://phpackages.com/badges/masyasmv-otus-moving-objects-multithreaded/health.svg)](https://phpackages.com/packages/masyasmv-otus-moving-objects-multithreaded)
```

###  Alternatives

[riipandi/laravel-optikey

Use UUID, Ulid, or nanoid as optional or primary key in Laravel.

429.1k](/packages/riipandi-laravel-optikey)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
