Perl rekrut tutaj, więc proszę być łagodne :)Perl gwintowania metody obiektu
Pisałem następujący kod do śledzenia moich psów kiedy poluję (nie bardzo). Za każdym razem, gdy pies znajduje kaczkę, sygnalizuje główną nić, która zbiera informacje od każdego z psów w paczce.
#!/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;
Oczekiwany wyjście powyższego kodu będzie coś takiego:
Labrador: znaleziono 1 kaczek !, Retriever: znaleziono 0 kaczki !, Shepherd: znaleziono 0 kaczki!
Labrador: znaleziono 2 kaczki !, Retriever: znaleziono 0 kaczek !, Pasterz: znaleziono 0 kaczek!
Labrador: znaleziono 3 kaczki !, Retriever: znaleziono 0 kaczek !, Pasterz: znaleziono 0 kaczek!
Labrador: znaleziono 3 kaczki !, Retriever: znaleziono 1 kaczki !, Pasterz: znaleziono 0 kaczek!
Labrador: znaleziono 4 kaczki !, Retriever: znaleziono 1 kaczki !, Pasterz: znaleziono 0 kaczek!
Labrador: znaleziono 5 kaczek !, Retriever: znaleziono 1 kaczki !, Pasterz: znaleziono 0 kaczek!
Labrador: znaleziono 6 kaczek !, Retriever: znaleziono 1 kaczki !, Pasterz: znaleziono 0 kaczek!
Labrador: znaleziono 6 kaczek !, Retriever: znaleziono 1 kaczki !, Pasterz: znaleziono 0 kaczek!
Labrador: znaleziono 6 kaczek !, Retriever: znaleziono 1 kaczki !, Pasterz: znaleziono 1 kaczkę!
Zamiast tego, co mam jest następujące:
Labrador: znaleziono 1 kaczek !, Retriever: znaleziono 0 kaczki !, Shepherd: znaleziono 0 kaczki!
Labrador: znaleziono 2 kaczki !, Retriever: znaleziono 0 kaczek !, Pasterz: znaleziono 0 kaczek!
Labrador: znaleziono 3 kaczki !, Retriever: znaleziono 0 kaczek !, Pasterz: znaleziono 0 kaczek!
Labrador: znaleziono 0 kaczek !, Retriever: znaleziono 1 kaczki !, Pasterz: znaleziono 0 kaczek!
Labrador: znaleziono 4 kaczki !, Retriever: znaleziono 0 kaczek !, Pasterz: znaleziono 0 kaczek!
Labrador: znaleziono 5 kaczek !, Retriever: znaleziono 0 kaczek !, Pasterz: znaleziono 0 kaczek!
Labrador: znaleziono 0 kaczek !, Retriever: znaleziono 2 kaczki !, Pasterz: znaleziono 0 kaczek!
Labrador: znaleziono 0 kaczek !, Retriever: znaleziono 0 kaczek !, Pasterz: znaleziono 1 kaczki!
Zauważ, że liczba kaczych psów każdego psa jest zerowa, gdy mówi inny pies.
Wszelkie spostrzeżenia, co do których szczególności przypis Musiałem pomijane podczas czytania Llama?
To bardzo dobre pytanie dla żółtodzioba Perla. :) –
Sygnały i wątki nie mieszają się dobrze. nie możesz zasygnalizować konkretnego wątku afaik. update: wydaje się, że wątki doc nie zgadzają się, ale pokazuje za pomocą '$ thr-> kill', a nie zwykłego zabicia – ysth
@JonahBishop - dziękuję, chyba :) Mam niecierpliwe w połowie Alpaki, zacząłem drapać jedną z moich przysłowiowych świrów ... domyślam się, że to jest to, co otrzymuję dla kodowania poza kolejnością :) –