Async-Defer

 view release on metacpan or  search on metacpan

t/2-do.t  view on Meta::CPAN

});
$p->do($d);
@result = ();
$p->run(undef, 3);
is_deeply \@result, [4,14], 'accept both CODE and Defer objects';

$d = Async::Defer->new();
$d->do(sub{
    my ($d, $n) = @_;
    $n++;
    $d->{t} = AE::timer 0.01, 0, sub{ $d->done($n) };
});
$d->do(sub{
    my ($d, $n) = @_;
    $n+=10;
    $result = $n;
    $d->done($n);
});
$t = AE::timer 0.01, 0, sub{ $d->run(undef, 3) };
$tx= AE::timer 0.5, 0, sub{ $cv->send };
$result = undef;
$cv = AE::cv; $cv->recv;
is $result, 14, 'handle correctly both sync and async functions';

$p = Async::Defer->new();
$d = Async::Defer->new();
$d->do(sub{
    my ($d, $n) = @_;
    $n //= 0;
    push @result, $n;

t/2-do_batch.t  view on Meta::CPAN


# - some tasks are CODE, some Defer objects
#   * they all doesn't share state (except ref-vars in same Defer clones)

my %seen;

$d = Async::Defer->new();
$d->do(sub{
    my ($d, @param) = @_;
    $param[0]++;
    $d->{t} = AE::timer 0.01, 0, sub { $d->done(@param) };
});
$d->do(sub{
    my ($d, @param) = @_;
    $seen{$d} = 1;
    push @result, {
        type => 'Defer',
        param=> \@param,
        state=> $d->{state}++,
        share=> ${$d->{share}}++,
    };

t/2-do_batch.t  view on Meta::CPAN

        share=> ${$d->{share}}++,
    };
    $d->done(@param);
} ]);
$p->do(sub{
    my ($p, @results) = @_;
    push @result, @results;
    $p->done();
});
(%seen, @result) = ();
$t = AE::timer 0.01, 0, sub{ $p->run(undef, [10], [20], [30], [40], [50]) };
$tx= AE::timer 0.5,  0, sub{ $cv->send };
$cv = AE::cv; $cv->recv;
is scalar(keys %seen), 5, 'all batch objects are different (ARRAY)';
is_deeply \@result, [
    { type=>'sub',      state=>0,   share=>0,   param=>[10] },
    { type=>'sub',      state=>0,   share=>0,   param=>[20] },
    { type=>'anon',     state=>0,   share=>0,   param=>[50] },
    { type=>'Defer',    state=>5,   share=>1,   param=>[31] },
    { type=>'Defer',    state=>5,   share=>2,   param=>[41] },
    [10], [20], [31], [41], [50],
    ], 'they all does not share state (ARRAY)';

t/2-do_batch.t  view on Meta::CPAN

        share=> ${$d->{share}}++,
    };
    $d->done(@param);
} });
$p->do(sub{
    my ($p, @results) = @_;
    %result = @results;
    $p->done();
});
(%seen, @result, %result) = ();
$t = AE::timer 0.01, 0, sub{ $p->run(undef, sub1=>[10], sub2=>[20], defer1=>[30], defer2=>[40], anon=>[50]) };
$tx= AE::timer 0.5,  0, sub{ $cv->send };
$cv = AE::cv; $cv->recv;
is scalar(keys %seen), 5, 'all batch objects are different (HASH)';
@result = sort { $a->{param}[0] <=> $b->{param}[0] } @result;
is_deeply \@result, [
    { type=>'sub',      state=>0,   share=>0,   param=>[10] },
    { type=>'sub',      state=>0,   share=>0,   param=>[20] },
    { type=>'Defer',    state=>5,   share=>3,   param=>[31] },
    { type=>'Defer',    state=>5,   share=>4,   param=>[41] },
    { type=>'anon',     state=>0,   share=>0,   param=>[50] },
    ], 'they all does not share state (HASH)';



( run in 0.474 second using v1.01-cache-2.11-cpan-49f99fa48dc )