Odvisnosti potekov dela
Čakanje na odvisnost poteka dela uporabite, kadar naj se vrhnji potek dela nadaljuje šele po zaključku drugih potekov dela. Tako usklajujete različne poteke dela, ne da bi vse prisilno združili v eno velikansko definicijo poteka dela.
Takšna čakanja se še posebej dobro dopolnjujejo s asinhronimi predajami, pri katerih en potek dela najprej zažene neodvisne podrejene poteke dela in nato pozneje počaka nanje.
Za podrobnejše primere načrtovalnika in izvajalnika glejte orkestracijo agentov.
Queuety ponuja tri metode gradnika:
wait_for_workflow()za en potek delawait_for_workflows()za več potekov dela s semantikoall,anyaliquorumwait_for_workflow_group(), kadar ID-ji potekov dela izvirajo iz predhodno zagnane skupine
Čakanje na en potek dela
$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();
Ko se research_run zaključi, se editorial_run nadaljuje. Če je nastavljeno result_key, se stanje zaključene odvisnosti shrani pod tem ključem:
$state['research']; // public state from the completed research workflow
Če ni nastavljenega result_key, se javno stanje odvisnega poteka dela združi z vrhnjim stanjem čakajočega poteka dela.
Čakanje na več potekov dela
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::Allnadaljuje samo, ko so zaključeni vsi navedeni poteki dela.WaitMode::Anynadaljuje, ko se zaključi prvi navedeni potek dela.WaitMode::Quorumnadaljuje, ko se uspešno zaključi zahtevano število potekov dela.
Queuety::workflow( 'synthesis_run' )
->wait_for_workflows(
[ $research_id, $editorial_id, $legal_id ],
WaitMode::Quorum,
'dependencies',
quorum: 2,
)
->then( PublishPacketStep::class )
->dispatch();
Z result_key se stanja zaključenih odvisnosti pri čakanju na več potekov dela shranijo pod ključi z ID-ji potekov dela:
[
'42' => [ 'summary' => '...' ],
'43' => [ 'summary' => '...' ],
]
Če ni nastavljenega result_key, se stanje zaključenih odvisnosti združi z vrhnjim stanjem čakajočega poteka dela v vrstnem redu odvisnosti.
Razreševanje ID-jev odvisnosti iz stanja poteka dela
Seznam odvisnosti lahko določite šele med izvajanjem, tako da iz javnega stanja preberete ID-je potekov dela:
Queuety::workflow( 'agent_follow_up' )
->wait_for_workflow( 'parent_workflow_id', 'parent' )
->then( FinalizeAgentRunStep::class )
->dispatch( [ 'parent_workflow_id' => $workflow_id ] );
Za več odvisnosti:
Queuety::workflow( 'aggregator' )
->wait_for_workflows( 'dependency_ids', WaitMode::Any, 'winner' )
->dispatch( [ 'dependency_ids' => [ 12, 18, 22 ] ] );
Čakanje na zagnano skupino potekov dela
Če je predhodni korak start_workflows() ali start_agents() shranil trajni ključ skupine, lahko počakate neposredno na to skupino, namesto da sami prenašate ID-je potekov dela prek javnega stanja.
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();
Kaj se zgodi med čakanjem
Ko potek dela doseže enega od teh korakov, preide v stanje waiting_for_workflows. Med čakanjem nanj ni vezan noben delavec.
$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']
Če se odvisnost zaključi, preden je dosežen korak čakanja, se potek dela takoj nadaljuje.
Semantika napak
Čakanja na odvisnosti potekov dela so usmerjena v uspeh:
wait_for_workflow()inWaitMode::Allspodletita, če katera koli zahtevana odvisnost spodleti ali je preklicana.WaitMode::Anyspodleti samo, ko vse odvisnosti dosežejo končno stanje in se nobena ne zaključi uspešno.WaitMode::Quorumspodleti, ko preostali aktivni poteki dela ne morejo več doseči zahtevanega kvoruma.
Zato so čakanja na poteke dela uporabna v sistemih z načrtovalnikom in izvajalnikom, kjer lahko en potek dela poskrbi za delo, drugi pa počaka na rezultate all ali na prvo uspešno vejo, ki se zaključi.