AnyEvent-Net-Curl-Queued
view release on metacpan or search on metacpan
lib/AnyEvent/Net/Curl/Queued.pm view on Meta::CPAN
sub count { return 0 + @{shift->queue} }
has share => (
is => 'ro',
isa => InstanceOf['Net::Curl::Share'],
default => sub { Net::Curl::Share->new({ stamp => time }) },
lazy => 1,
);
has stats => (is => 'ro', isa => InstanceOf['AnyEvent::Net::Curl::Queued::Stats'], default => sub { AnyEvent::Net::Curl::Queued::Stats->new }, lazy => 1);
has timeout => (is => 'ro', isa => Num, default => sub { 60.0 });
has unique => (is => 'ro', isa => HashRef[Str], default => sub { {} });
has watchdog => (is => 'ro', isa => AnyOf[ArrayRef, Object], writer => 'set_watchdog', clearer => 'clear_watchdog', predicate => 'has_watchdog', weak_ref => 0);
sub BUILD {
my ($self) = @_;
$self->set_multi(
AnyEvent::Net::Curl::Queued::Multi->new({
max => $self->max,
timeout => $self->timeout,
})
);
$self->share->setopt(Net::Curl::Share::CURLSHOPT_SHARE, Net::Curl::Share::CURL_LOCK_DATA_COOKIE); # 2
$self->share->setopt(Net::Curl::Share::CURLSHOPT_SHARE, Net::Curl::Share::CURL_LOCK_DATA_DNS); # 3
## no critic (RequireCheckingReturnValueOfEval)
eval { $self->share->setopt(Net::Curl::Share::CURLSHOPT_SHARE, Net::Curl::Share::CURL_LOCK_DATA_SSL_SESSION) };
return;
}
sub BUILDARGS {
my $class = shift;
if (@_ == 1 and q(HASH) eq ref $_[0]) {
return shift;
} elsif (@_ % 2 == 0) {
return { @_ };
} elsif (@_ == 1) {
return { max => shift };
} else {
confess 'Should be initialized as ' . $class . '->new(Hash|HashRef|Int)';
}
}
sub start {
my ($self) = @_;
# watchdog
$self->set_watchdog(AE::timer 1, 1, sub {
$self->multi->perform;
$self->empty;
});
# populate queue
$self->add($self->dequeue)
while
$self->count
and ($self->multi->handles < $self->max);
# check if queue is empty
$self->empty;
return;
}
sub empty {
my ($self) = @_;
AE::postpone { $self->cv->send }
if
$self->completed > 0
and $self->count == 0
and $self->multi->handles == 0;
return;
}
sub add {
my ($self, $worker) = @_;
# vivify the worker
$worker = $worker->()
if ref($worker) eq 'CODE';
# self-reference & warmup
$worker->queue($self);
$worker->init;
# check if already processed
if ($self->allow_dups
or $worker->force
or ++$self->unique->{$worker->unique} == 1
) {
# fire
$self->multi->add_handle($worker);
}
return;
}
sub append {
my ($self, $worker) = @_;
$self->queue_push($worker);
$self->start;
( run in 1.103 second using v1.01-cache-2.11-cpan-39bf76dae61 )