Perl rookie qui, quindi cerca di essere gentile :)Perl filettatura del metodo oggetto
Ho scritto seguente codice per tenere traccia dei miei cani quando sono in caccia (non proprio). Ogni volta che un cane trova un'anatra, segnala il filo principale, che quindi raccoglie informazioni da ciascuno dei cani nel mazzo.
#!/usr/bin/env perl
use strict;
use warnings;
use v5.14;
use threads;
{
package Dog;
sub new {
my ($class, $name, $dt) = @_;
my $self = {
dt => $dt, # will find a duck every $dt seconds
name => $name,
ducksfound => 0
};
bless $self, $class;
}
sub hunt {
#
# the "thread" method -- the dog will hang around for $dt seconds,
# then alert the main thread by sending SIGUSR1
#
my $self = shift;
while (1) {
sleep $self->{dt};
$self->{ducksfound} += 1;
kill USR1 => $$;
}
}
sub bark {
my $self = shift;
sprintf "%s: found %d ducks!", ($self->{name}, $self->{ducksfound});
}
1;
}
my @dogs;
$SIG{USR1} = sub {
say join ", ", map { $_->bark } @dogs;
};
push @dogs, Dog->new("Labrador", 1);
push @dogs, Dog->new("Retriever", 2);
push @dogs, Dog->new("Shepherd", 3);
threads->create(sub { $_->hunt }) for @dogs;
$_->join for threads->list;
uscita prevista del codice di cui sopra sarebbe qualcosa di simile:
Labrador: trovati 1 anatre !, Retriever: trovati 0 anatre !, Pastore: ha trovato 0 anatre!
Labrador: trovato 2 anatre !, Retriever: trovato 0 anatre !, Pastore: trovato 0 anatre!
Labrador: trovato 3 anatre !, Retriever: trovato 0 anatre !, Pastore: trovato 0 anatre!
Labrador: trovato 3 anatre !, Retriever: trovato 1 anatre !, Pastore: trovato 0 anatre!
Labrador: trovato 4 anatre !, Retriever: trovato 1 anatre !, Pastore: trovato 0 anatre!
Labrador: trovato 5 anatre !, Retriever: trovato 1 anatre !, Pastore: trovato 0 anatre!
Labrador: trovato 6 anatre !, Retriever: trovato 1 anatre !, Pastore: trovato 0 anatre!
Labrador: trovato 6 anatre !, Retriever: trovato 1 anatre !, Pastore: trovato 0 anatre!
Labrador: trovato 6 anatre !, Retriever: trovato 1 anatre !, Pastore: trovato 1 anatre!
Invece, quello che ottengo è il seguente:
Labrador: trovati 1 anatre !, Retriever: trovati 0 anatre !, Pastore: trovato 0 anatre!
Labrador: trovato 2 anatre !, Retriever: trovato 0 anatre !, Pastore: trovato 0 anatre!
Labrador: trovato 3 anatre !, Retriever: trovato 0 anatre !, Pastore: trovato 0 anatre!
Labrador: trovato 0 anatre !, Retriever: trovato 1 anatre !, Pastore: trovato 0 anatre!
Labrador: trovato 4 anatre !, Retriever: trovato 0 anatre !, Pastore: trovato 0 anatre!
Labrador: trovato 5 anatre !, Retriever: trovato 0 anatre !, Pastore: trovato 0 anatre!
Labrador: trovato 0 anatre !, Retriever: trovato 2 anatre !, Pastore: trovato 0 anatre!
Labrador: trovato 0 anatre !, Retriever: trovato 0 anatre !, Pastore: trovato 1 anatre!
Nota come il numero di anatre di ogni cane si azzera a zero, un altro cane sta parlando.
Qualche intuizione su quale nota in particolare devo aver sorvolato mentre leggevo il Lama?
Questa è una bella domanda per un debuttante Perl. :) –
segnali e thread non si combinano bene. non è possibile segnalare un particolare thread afaik. aggiornamento: sembra che il thread doc non sia d'accordo, ma mostra l'uso di '$ thr-> kill', non plain kill – ysth
@JonahBishop - grazie, suppongo :) Impaziente a metà strada attraverso l'Alpaca, ho iniziato a grattarmi uno dei miei proverbiali pruriti ... Immagino che questo è ciò che ottengo per la codifica fuori turno :) –