The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

Mojo::AsyncList - Process a list with callbacks

SYNOPSIS

use Mojo::AsyncList;
use Mojo::mysql;

my $mysql = Mojo::mysql->new;
my $db    = $mysql->db;

my $async_list = Mojo::AsyncList->new(
  sub { # Specify a "item" event handler
    my ($async_list, $username, $gather_cb) = @_;
    $db->select("users", {username => $username}, $gather_cb);
  },
  sub { # Specify a "finish" event handler
    my $async_list = shift;
    warn $_->[0]{user_id} for @_; # @_ = ([$db_res_supergirl], [$db_res_superman], ...)
  },
);

my @users = qw(supergirl superman batman);
$async_list->concurrent(2);
$async_list->process(\@users);
$async_list->wait;

DESCRIPTION

Mojo::AsyncList is a module that can asynchronously process a list of items with callback.

EVENTS

finish

$async_list->on(finish => sub { my ($async_list, @all_res) = @_; });

Emitted when "process" is done with all the $items. @all_res is a list of array-refs, where each item is @res passed on to "result".

item

$async_list->on(item => sub { my ($async_list, $item, $gather_cb) = @_; });

Used to process the next $item in $items passed on to "process".

result

$async_list->on(result => sub { my ($async_list, @res) = @_; });

Emitted when a new result is ready, @res contains the data passed on to $gather_cb.

ATTRIBUTES

concurrent

$int        = $async_list->concurrent;
$async_list = $async_list->concurrent(0);

Used to set the number of concurrent items to process. Default value is zero, which means "process all items" at once.

Used to see how many items that is processing right now.

offset

$int        = $async_list->offset;
$async_list = $async_list->offset(1);

Will remove the number of arguments passed on to <$gather_cb>, used in the "item" event. Default to "1", meaning it will remove the invocant.

METHODS

new

$async_list = Mojo::AsyncList->new;
$async_list = Mojo::AsyncList->new(@attrs);
$async_list = Mojo::AsyncList->new(\%attrs);
$async_list = Mojo::AsyncList->new($item_cb, $finish_cb);
$async_list = Mojo::AsyncList->new($item_cb, $finish_cb, \%attrs);

Used to create a new Mojo::AsyncList object. "item" and finish event callbacks can be provided when constructing the object.

process

$async_list = $async_list->process(@items);
$async_list = $async_list->process([@items]);

Process $items and emit "EVENTS" while doing so.

stats

$int          = $async_list->stats("done");
$int          = $async_list->stats("remaining");
$gettimeofday = $async_list->stats("t0");
$hash_ref     = $async_list->stats;

Used to extract stats while items are processing. This can be useful inside the "EVENTS", or within a recurring timer:

Mojo::IOLoop->recurring(1 => sub {
  warn sprintf "[%s] done: %s\n", time, $async_list->stats("done");
});

Changing the $hash_ref will have fatal consequences.

wait

$async_list->concurrent(2)->process(\@items)->wait;
$async_list->wait;

Used to block and wait until Mojo::AsyncList is done with the $items passed on to "process".

AUTHOR

Jan Henning Thorsen