Perl Rookie hier, also bitte sanft sein :)Perl Einfädeln Objektmethode
Ich habe geschrieben Code folgende Spur meiner Hunde zu halten, wenn ich (nicht wirklich) zu jagen. Jedes Mal wenn ein Hund eine Ente findet, signalisiert er dem Hauptfaden, der dann Informationen von jedem der Hunde in der Packung sammelt.
#!/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;
Erwartete Ausgabe des obigen Code wäre so etwas wie:
Labrador: 1 Enten !, Retriever gefunden: gefundene0 Enten !, Shepherd: gefundene0 Enten!
Labrador: 2 Enten gefunden !, Retriever: 0 Enten gefunden !, Hirte: 0 Enten gefunden!
Labrador: gefunden 3 Enten !, Retriever: gefunden 0 Enten !, Hirte: gefunden 0 Enten!
Labrador: 3 Enten gefunden !, Retriever: 1 Enten gefunden !, Hirte: 0 Enten gefunden!
Labrador: 4 Enten gefunden !, Retriever: 1 Enten gefunden !, Schäferhund: 0 Enten gefunden!
Labrador: 5 Enten gefunden !, Retriever: 1 Enten gefunden !, Hirte: 0 Enten gefunden!
Labrador: gefunden 6 Enten !, Retriever: gefunden 1 Enten !, Hirte: gefunden 0 Enten!
Labrador: gefunden 6 Enten !, Retriever: gefunden 1 Enten !, Hirte: gefunden 0 Enten!
Labrador: gefunden 6 Enten !, Retriever: 1 Enten gefunden !, Schäfer: 1 Enten gefunden!
Statt dessen, was ich erhalte, ist die folgende:
Labrador: 1 gefundene Enten !, Retriever: gefundene0 Enten !, Shepherd: gefundene0 Enten!
Labrador: 2 Enten gefunden !, Retriever: 0 Enten gefunden !, Hirte: 0 Enten gefunden!
Labrador: gefunden 3 Enten !, Retriever: gefunden 0 Enten !, Hirte: gefunden 0 Enten!
Labrador: gefunden 0 Enten !, Retriever: gefunden 1 Enten !, Hirte: gefunden 0 Enten!
Labrador: gefunden 4 Enten !, Retriever: gefunden 0 Enten !, Hirte: gefunden 0 Enten!
Labrador: gefunden 5 Enten !, Retriever: gefunden 0 Enten !, Hirte: gefunden 0 Enten!
Labrador: gefunden 0 Enten !, Retriever: gefunden 2 Enten !, Hirte: gefunden 0 Enten!
Labrador: gefunden 0 Enten !, Retriever: gefunden 0 Enten !, Schäfer: gefunden 1 Enten!
Beachten Sie, wie die Anzahl der Enten jedes Hundes auf Null zurückgesetzt wird, wenn ein anderer Hund spricht.
Gibt es irgendwelche Einsichten darüber, welche Fußnote ich beim Lesen des Llama beschönigt haben muss?
Dies ist eine ziemlich gute Frage für einen Perl-Rookie. :) –
Signale und Threads nicht gut mischen. Sie können nicht einen bestimmten Thread afaik signalisieren. update: scheint das threads doc nicht zu stimmen, zeigt aber mit '$ thr-> kill', nicht einfach kill – ysth
@JonahBishop - danke, schätze ich :) Ungeduldig auf halbem Weg durch das Alpaka, begann ich einen meiner sprichwörtlichen Juckreiz zu kratzen ... schätze, das ist, was ich bekomme, wenn ich außerhalb der Reihe bin :) –