Skip to content

Commit

Permalink
fix readme
Browse files Browse the repository at this point in the history
  • Loading branch information
kuaukutsu committed Dec 16, 2023
1 parent c576152 commit 95d41ec
Showing 1 changed file with 33 additions and 31 deletions.
64 changes: 33 additions & 31 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,30 +1,29 @@
# Proof of Concept: Task (Задача, Задание)

Простая структурная единица, которая позволяет декомпозировать многосоставные, сложные задачи, на подзадачи, без потери
общей связи.
Для запуска задач и контроля за их выполнением используется менеджер процессов основанным на компоненте event-loop.
общей связи. Для запуска задач и контроля за их выполнением используется менеджер процессов (_TaskManager_) основанный на компоненте event-loop.

## Глоссарий

- **Task** - задача, содержит конфигурацию этапов, состояние обработки, и результат работы.
- **TaskStage** - структурная единица задачи, описывает полезное действое в случае успешной, или не успешной работы.
- **Task** - задача, содержит конфигурацию этапов - подзадач, состояние обработки, и результат работы.
- **TaskStage** - структурная единица задачи - этап, подзадача. Описывает полезную работу.
- **TaskManager** - менеджер процессов, контролирует запуск и работу задач.

## Описание работы

Общий процесс можно описать через три основные компоненты:

- задача (**EntityTask**)
- менеджер процессов (**TaskManager**/**pm**)
- обработчик этапов (**EntityHandler**)
- менеджер процессов (**TaskManager**)
- обработчик этапов (**TaskHandler**)

Жизненный цикл задачи:

- создание задачи (черновик)
- сохранение задачи и постановка задачи в очередь на выполнение
- запуск задачи
- обработка этапов
- сохранение результата
- создание задачи через черновик (application)
- сохранение задачи и постановка задачи в очередь на выполнение (application)
- запуск задачи (task manager)
- обработка этапов (task manager/task handler)
- сохранение результата (task manager/task handler)

### Создание задачи

Expand Down Expand Up @@ -59,40 +58,37 @@ $manager = $container->get(TaskManager::class);
$manager->run(
new TaskManagerOptions(
bindir: __DIR__,
heartbeat: 5.,
keeperInterval: 2.,
handlerEndpoint: 'handler.php',
heartbeat: (float)argument('heartbeat', 2),
keeperInterval: (float)argument('iterval', 1),
queueSize: (int)argument('process', 30),
handler: 'handler.php',
)
);
```

- **heartbeat** задаёт частоту проверки заданий для выполнения.
- **keeperInterval** задаёт частоту проверки результатов выполнения.
- **queueSize** задаёт размер очереди заданий на выполнение. Можно представить как количество консумеров для обработки
заданий.
- **handlerTimeout** задаёт максимальное время для обработки отдельного этапа задачи. По истечении будет выбрашено
исключение timeout.
- **heartbeat** частота постановки задач в очередь для выполнения.
- **keeperInterval** частота проверки результатов выполнения запущенных процессов.
- **queueSize** размер очереди задач. Условно можно представить как количество консумеров для обработки задач.
- **timeout** задаёт максимальное время для обработки отдельного этапа задачи. По истечении будет выбрашено исключение timeout.
- **handler** программа обработки задач. Любая задача это отдельный php процесс - обработчик для выполнения полезной работы.

#### Обработчик - handlerEndpoint: 'handler.php'
#### Обработчик - handler: 'handler.php'

```php

use function kuaukutsu\poc\task\tools\get_previous_uuid;
use function kuaukutsu\poc\task\tools\get_stage_uuid;
use function kuaukutsu\poc\task\tools\get_task_uuid;

$handler = $container->get(StageHandler::class);
$handler->handle(get_stage_uuid(), get_previous_uuid());
$exitCode = $handler->handle(
get_task_uuid(),
get_stage_uuid(),
get_previous_uuid(),
);
exit($exitCode);
```

## Пример

Представим следующую задачу:

- есть файл формата exel на 100_000 строк, и две колонки: ID и NAME
- есть класс обработчик, который на вход получает пару ID и NAME,
выполняет полезную работу и возвращает результат в виде преобразованной строки
- и есть класс, который получает массив преобразованных строк, и заполняет отчёт (в произвольном порядке)

## Docker

```shell
Expand All @@ -113,6 +109,12 @@ docker run --init -it --rm -v "$(pwd):/app" -w /app ghcr.io/kuaukutsu/php:8.1-cl

### Run

Самый лучший пример - это рабочий код.

В данном случае имеем две ручки:
- **builder** - постановка задач
- **runner** - обработка задач

**builder**

```shell
Expand Down

0 comments on commit 95d41ec

Please sign in to comment.