Perlのルーキーは、とても優しくしてください:)Perlのスレッドは、ここで
私は(本当に)狩猟していたときに私の犬を追跡するために、次のコードを書いています。犬がアヒルを見つけるたびに、それはメインスレッドに信号を送り、そこでパック内の各犬から情報を収集します。
ラブラドール:上記のコードの
の予想される出力は次のようなものになるだろう
1羽のカモ!レトリバーが見つかりました:0カモ!シェパードが見つかりました:0アヒルを見つけました!#!/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;
ラブラドール:2頭のアヒルが見つかりました!、リトリーバー:0頭のアヒルが見つかりました!、シェパード:アヒルが0頭見つかりました!
ラブラドール:3頭のアヒルが見つかりました!、リトリーバー:0頭のアヒルが見つかりました!、シェパード:0頭のアヒルが見つかりました!
ラブラドール:3頭のアヒルが見つかりました!、リトリーバー:1頭のアヒルが見つかりました!、シェパード:アヒルが0頭見つかりました!
ラブラドール:4頭のアヒルが見つかりました!、リトリーバー:1頭のアヒルが見つかりました!、シェパード:アヒルが0頭見つかりました!
ラブラドール:5頭のアヒルが見つかりました!、リトリーバー:1頭のアヒルを見つけました!、シェパード:アヒルが0頭見つかりました!
ラブラドール:6頭のアヒルを見つけました!、レトリーバー:1頭のアヒルを見つけました!、シェパード:アヒルを見つけました!
ラブラドール:6頭のアヒルを見つけました!、レトリーバー:1頭のアヒルを見つけました!、シェパード:アヒルを見つけました!
ラブラドール:6頭のアヒルが見つかりました!、レトリーバー:1頭のアヒルが見つかりました!、シェパード:1頭のアヒルが見つかりました!
はその代わり、私が取得することは以下の通りです:
ラブラドール:1匹のアヒル!レトリバーが見つかりました:0カモ!シェパードが見つかりました:0アヒルを見つけました!
ラブラドール:2頭のアヒルが見つかりました!、リトリーバー:0頭のアヒルが見つかりました!、シェパード:アヒルが0頭見つかりました!
ラブラドール:3頭のアヒルが見つかりました!、リトリーバー:0頭のアヒルが見つかりました!、シェパード:0頭のアヒルが見つかりました!
ラブラドール:0アヒルが見つかりました!、レトリーバー:1アヒルが見つかりました!、シェパード:0アヒルが見つかりました!
ラブラドール:4頭のアヒルが見つかりました!、リトリーバー:0頭のアヒルが見つかりました!、シェパード:0頭のアヒルが見つかりました!
ラブラドール:5頭のアヒルが見つかりました!、リトリーバー:0頭のアヒルが見つかりました!、シェパード:アヒルが0頭見つかりました!
ラブラドール:アヒルが見つかりました!、レトリーバー:アヒルが2つ見つかりました!、シェパード:アヒルが見つかりました!
ラブラドール:0アヒルが見つかりました!、レトリーバー:0アヒルが見つかりました!、シェパード:1アヒルが見つかりました!
他の犬が話している間、どの犬の鴨の数もゼロにリセットされていることに注意してください。
私はラマを読んでいる間、どの特定の脚注を見ていたに違いないかについての洞察はありますか?
これはPerl新人にとって非常に大きな質問です。 :) –
信号とスレッドはうまく混合されません。あなたは特定のスレッドafaikを通知することはできません。アップデート:スレッドのドキュメントには同意していないようですが、普通のkillではなく '$ thr-> kill'を使って表示されます – ysth
@JonahBishop - ありがとう、私は推測しています:)途中でアルパカの途中で困ったことがあります。これは私が順番にコーディングするために得たものです: –