
# Darbplūsmu atkarības

Izmantojiet darbplūsmu atkarību gaidīšanu, ja vienai augstākā līmeņa darbplūsmai jāturpinās tikai pēc citu darbplūsmu pabeigšanas. Tas ļauj koordinēt vairākas darbplūsmas, neapvienojot visu vienā milzīgā darbplūsmas definīcijā.

Šāda gaidīšana īpaši labi sader ar [Asinhroniem nodošanas procesiem](https://queuety.inline0.dev/lv/docs/workflows/async-handoffs), kad viena darbplūsma vispirms sāk neatkarīgas pakārtotās darbplūsmas un vēlāk tās sagaida.

Pilnīgākus plānotāja un izpildītāja piemērus skatiet sadaļā [Aģentu orķestrēšana](https://queuety.inline0.dev/lv/docs/workflows/agent-orchestration).

Queuety nodrošina trīs veidotāja metodes:

- `wait_for_workflow()` vienai darbplūsmai
- `wait_for_workflows()` vairākām darbplūsmām ar `all`, `any` vai `quorum` semantiku
- `wait_for_workflow_group()`, ja darbplūsmu ID tiek iegūti no iepriekš sāktas grupas

## Gaidīt vienu darbplūsmu

```php
$research_id = Queuety::workflow( 'research_run' )
    ->then( PlanResearchStep::class )
    ->for_each( 'tasks', ExecuteResearchTask::class, 'results' )
    ->dispatch( [ 'brief_id' => 42 ] );

$editorial_id = Queuety::workflow( 'editorial_run' )
    ->wait_for_workflow( $research_id, 'research' )
    ->then( DraftBriefStep::class )
    ->dispatch();
```

Kad `research_run` ir pabeigta, `editorial_run` atsāk darbību. Ja ir iestatīts `result_key`, pabeigtās atkarīgās darbplūsmas stāvoklis tiek saglabāts ar šo atslēgu:

```php
$state['research']; // public state from the completed research workflow
```

Ja nav norādīts `result_key`, atkarīgās darbplūsmas publiskais stāvoklis tiek apvienots ar gaidošās darbplūsmas augstākā līmeņa stāvokli.

## Gaidīt vairākas darbplūsmas

```php
use Queuety\Enums\WaitMode;

Queuety::workflow( 'synthesis_run' )
    ->wait_for_workflows(
        [ $research_id, $editorial_id, $legal_id ],
        WaitMode::All,
        'dependencies'
    )
    ->then( PublishPacketStep::class )
    ->dispatch();
```

- `WaitMode::All` atsāk darbību tikai tad, kad visas norādītās darbplūsmas ir pabeigtas.
- `WaitMode::Any` atsāk darbību, kad pabeigta pirmā no norādītajām darbplūsmām.
- `WaitMode::Quorum` atsāk darbību, kad nepieciešamais darbplūsmu skaits ir veiksmīgi pabeigts.

```php
Queuety::workflow( 'synthesis_run' )
    ->wait_for_workflows(
        [ $research_id, $editorial_id, $legal_id ],
        WaitMode::Quorum,
        'dependencies',
        quorum: 2,
    )
    ->then( PublishPacketStep::class )
    ->dispatch();
```

Ar `result_key` vairāku darbplūsmu gaidīšanas gadījumā pabeigto atkarīgo darbplūsmu stāvoklis tiek saglabāts, izmantojot darbplūsmas ID kā atslēgas:

```php
[
    '42' => [ 'summary' => '...' ],
    '43' => [ 'summary' => '...' ],
]
```

Ja nav norādīts `result_key`, pabeigto atkarīgo darbplūsmu stāvoklis atkarību secībā tiek apvienots ar gaidošās darbplūsmas augstākā līmeņa stāvokli.

## Atkarību ID iegūšana no darbplūsmas stāvokļa

Atkarību sarakstu varat atlikt līdz izpildlaikam, iegūstot darbplūsmu ID no publiskā stāvokļa:

```php
Queuety::workflow( 'agent_follow_up' )
    ->wait_for_workflow( 'parent_workflow_id', 'parent' )
    ->then( FinalizeAgentRunStep::class )
    ->dispatch( [ 'parent_workflow_id' => $workflow_id ] );
```

Vairākām atkarībām:

```php
Queuety::workflow( 'aggregator' )
    ->wait_for_workflows( 'dependency_ids', WaitMode::Any, 'winner' )
    ->dispatch( [ 'dependency_ids' => [ 12, 18, 22 ] ] );
```

## Gaidīt sāktu darbplūsmu grupu

Ja iepriekšējā `start_workflows()` vai `start_agents()` solī tika saglabāta noturīga grupas atslēga, varat gaidīt tieši šo grupu, nevis pašiem nodot darbplūsmu ID, izmantojot publisko stāvokli.

```php
Queuety::workflow( 'brief_research' )
    ->then( PlanTopicsStep::class )
    ->start_agents( 'agent_tasks', $agent_run, group_key: 'researchers' )
    ->wait_for_agent_group( 'researchers', WaitMode::Quorum, 2, 'agent_results' )
    ->then( SynthesizeBriefStep::class )
    ->dispatch();
```

## Kas notiek gaidīšanas laikā

Kad darbplūsma sasniedz kādu no šiem soļiem, tās statuss tiek mainīts uz `waiting_for_workflows`. Gaidīšanas laikā neviens darbinieks tai nav piesaistīts.

```php
$state = Queuety::workflow_status( $workflow_id );
echo $state->status->value; // 'waiting_for_workflows'
echo $state->wait_type;     // 'workflow'
print_r( $state->waiting_for ); // ['42', '43']
```

Ja atkarīgā darbplūsma ir pabeigta, pirms tiek sasniegts gaidīšanas solis, darbplūsma turpinās nekavējoties.

## Kļūmju apstrādes semantika

Darbplūsmu atkarību gaidīšanas ir orientētas uz veiksmīgu izpildi:

- `wait_for_workflow()` un `WaitMode::All` cietīs neveiksmi, ja kāda nepieciešamā atkarīgā darbplūsma cietīs neveiksmi vai tiks atcelta.
- `WaitMode::Any` cietīs neveiksmi tikai tad, kad visas atkarīgās darbplūsmas būs sasniegušas galīgo statusu un neviena nebūs veiksmīgi pabeigta.
- `WaitMode::Quorum` cietīs neveiksmi, ja atlikušās aktīvās darbplūsmas vairs nespēs sasniegt nepieciešamo kvorumu.

Tāpēc darbplūsmu gaidīšana noder plānotāja un izpildītāja sistēmās, kur viena darbplūsma var pieprasīt darbu, bet cita var gaidīt `all` rezultātus vai pirmo veiksmīgo pabeigto zaru.
