Async-Trampoline
view release on metacpan or search on metacpan
t/scheduler.t view on Meta::CPAN
it q(handles complicated access pattern) => sub {
my $scheduler = Async::Trampoline::Scheduler->new(2);
for my $round (2**0 .. 2**8) {
subtest qq(round $round) => sub {
my @results;
$scheduler->enqueue(async_value $_) for 0 .. $round - 1;
for my $x ($round .. 2 * $round) {
$scheduler->enqueue(async_value $x);
push @results, $scheduler->dequeue->run_until_completion;
}
while (my ($async) = $scheduler->dequeue) {
push @results, $async->run_until_completion;
}
my @values = (0 .. 2 * $round);
is "@results", "@values";
};
}
};
it q(discards dupes) => sub {
my @values = (0 .. 4);
my @async_values = map { async_value $_ } @values;
my @asyncs;
push @asyncs, @async_values[$_ .. 4] for @values; # repeat objects
is 0+@asyncs, (@values + 1 + 2 + 3 + 4), "precondition";
my $scheduler = Async::Trampoline::Scheduler->new;
$scheduler->enqueue($_) for @asyncs;
my @result_asyncs;
while (my ($async) = $scheduler->dequeue) {
push @result_asyncs, $async;
}
is 0+@result_asyncs, 0+@values;
my @results = map { $_->run_until_completion } @result_asyncs;
is "@results", "@values";
};
it q(knows about task dependencies) => sub {
my $scheduler = Async::Trampoline::Scheduler->new;
my $starter = async_value 0;
$scheduler->enqueue($starter => (async_value 1), (async_value 2));
my $starter_again = $scheduler->dequeue;
is $starter, $starter_again, q(got starter async back);
is scalar $scheduler->dequeue, undef, q(queue has no further elems);
$scheduler->complete($starter_again);
my @results;
while (my ($async) = $scheduler->dequeue) {
push @results, $async->run_until_completion;
}
@results = sort @results;
is "@results", "1 2", q(got blocked tasks back);
};
done_testing;
( run in 1.229 second using v1.01-cache-2.11-cpan-13bb782fe5a )