Supponiamo di avere un numero di attività in un'applicazione che può finire in qualsiasi ordine. E ho bisogno di eseguire del codice quando tutti i compiti sono finiti. Se ciò è importante, l'applicazione è in esecuzione su AnyEvent, ma senza Coro.Richiamate multiplexing
In un certo senso, AnyEvent '$cv->begin/$cv->end
consentire quello che voglio. Tuttavia, mi piacerebbe avere un controllo più fine. Ad esempio, mi piacerebbe non essere in grado di "finire" un compito due volte. Anche la capacità di raccogliere dati da tutte le attività sarebbe piacevole.
Naturalmente, questo può essere fatto. Imposta molti callback che condividono un hash; cancella le chiavi da quell'hash quando termina un'attività; chiama il megacallback quando l'hash è vuoto. Mi chiedo se c'è un modo più civile di farlo, forse un modulo CPAN?
Ad esempio, ecco un'API immaginaria che soddisferà il mio bisogno.
#!/usr/bin/perl -w
use strict;
use Some::Module;
# Set goals
my $cb = Some::Module->new(sub { say 'BOOM!' });
$cb->begin(qw(foo bar));
# Much later, as tasks start getting done
$cb->end(foo => 42); # "return" value from task 'foo'
$cb->begin('baz'); # can add more tasks, why not
$cb->end('bar'); # just finish task 'bar'
# still waiting for 'baz' to finish at this point
# Finally, last hanging task is done
$cb->end(baz => 137); # BOOM!
# at this point, sub {}->({ foo=>42, bar=>undef, baz=>137 })
# has been called
Vedere anche il mio perlmonks question.
C'è qualcosa del genere?
Il MergePoint è * esattamente * quello che ho chiesto, grazie. – Dallaylaen
Anche il futuro sembra promettente. Grazie ancora. Vorrei poter invocare due volte. – Dallaylaen