AnyEvent-Gearman-WorkerPool

 view release on metacpan or  search on metacpan

lib/AnyEvent/Gearman/WorkerPool/Slot.pm  view on Meta::CPAN

package AnyEvent::Gearman::WorkerPool::Slot;


# ABSTRACT: Slot class
our $VERSION = '1.0'; # VERSION
use Log::Log4perl qw(:easy);

use Moose;
use AnyEvent;
use AnyEvent::Gearman::WorkerPool::Worker;
use Data::Dumper;

has libs=>(is=>'rw',isa=>'ArrayRef',default=>sub{[]});
has job_servers=>(is=>'rw',isa=>'ArrayRef',required=>1);
has workleft=>(is=>'rw');
has worker_package=>(is=>'rw');
has worker_channel=>(is=>'rw');

has is_busy=>(is=>'rw',default=>0);
has is_stopped=>(is=>'rw',default=>1);
has boss_channel=>(is=>'rw',default=>'');

has worker_watcher=>(is=>'rw');
has worker_pid=>(is=>'rw');


sub BUILD{
    my $self = shift;
}

sub is_idle{
    my $self = shift;
    return ($self->is_running)&&(!$self->is_busy);
}
sub is_running{
    my $self = shift;
    return (!$self->is_stopped);
}

sub stop{
    DEBUG 'stop called';
    my $self = shift;
    $self->is_stopped(1);
    if( $self->worker_pid ){
        kill INT => $self->worker_pid;
    }
}

sub start{
    my $self = shift;
    
    my $cpid = fork();
    if( $cpid ){
        $self->worker_pid($cpid);
        $self->worker_watcher( AE::child $cpid, sub{
            my ($pid,$status) = @_;
            if( $self->is_stopped != 1){
                DEBUG '------------------ child restart ------------------------';
                $self->start();
            }
            else{
                DEBUG 'kill child OK';
                $self->worker_pid(undef);
                $self->worker_watcher(undef);
            }
        });
        $self->is_stopped(0);
    }
    else{
        my $class = $self->worker_package;
        my $boss_channel = $self->boss_channel;



( run in 1.741 second using v1.01-cache-2.11-cpan-39bf76dae61 )