2012-04-30 7 views
0

私はPerlを初めて使用しており、スレッド化を必要とするプログラムを作成しています。私はPerlでthreads featureを見つけましたが、私はまだ少し混乱しています。この記事のタイトルで述べたように、おそらくスレッドを使用するのはJavaが最も一般的です。私はそれが完璧だと言っているわけではありませんが、Threadクラスを使って仕事を終えることができます。Perl対Javaでのマルチスレッド化

JavaではstartThreadsというメソッドがあり、そのメソッドでスレッドを作成して起動しました。それらを開始した後、トレッドが完了したかどうかをチェックするwhileループがあります。すべてのスレッドが正常に終了した場合、whileループは終了しますが、そうでない場合、whileループは、どのスレッドがタイムアウトしたかを監視していて、それらのスレッドを安全に中断し、シャットダウンフラグをtrueに設定します。

問題: 私は上記のアルゴリズムと同じアルゴリズムを使用したいと思いますが、もちろんPerlには違いがあります。私はPerlに慣れています。他のスレッドの実行中にwhileループを実行させることは可能ですか?どうしたの?

+1

はい、可能ですが、まったく同じ方法で行われます。何を試しましたか?ちょうどそれを与える、概念は同じです。 – Mat

+1

あなたはhttp://perldoc.perl.org/perlthrtut.htmlを読んでいますか? –

+0

あなたはおそらく 'detach'メソッドを探しています。何かを返すことができないという問題があります。ときには、perlスレッドはややこしいことがあります。私がしばらく書いたマルチスレッドDNS検索スクリプトを掘り起こすことができます。 –

答えて

0

に答えられるべきで、私は、サイバーガードEnterpriseが正しかったことがわかりました。スレッドを切り離すことによって、メインはまだ動作しています。私はまだそれをテストしていないが、$ thr-> is_running()のように見えるスレッドがまだ実行されている場合は私に教えてください。

これは提供されたURLから取得され、どのようにデタッチが使用されるかを示しています。 perldoc.perl.org/perlthrtut.html?

use threads; 
my $thr = threads->create(\&sub1); # Spawn the thread 
$thr->detach(); # Now we officially don't care any more 
sleep(15); # Let thread run for awhile 
sub sub1 { 
$a = 0; 
while (1) { 
$a++; 
print("\$a is $a\n"); 
sleep(1); 
} 
} 
2

threads->list()を使用してwhileループをPerlに実装できますが、最初に別のアプローチを検討する必要があります。

スレッドを待つ代わりに、結果を待つのはどうですか?

ここでの基本的な考え方は、作業単位をキューから取り出し、作業単位(オブジェクトまたは例外のいずれか)の結果を出力キューに入れるコードがあることです。

入力キュー内の作業単位を待機する2つのスレッドを開始します。表示されたら、作業単位を実行し、その結果を出力キューに入れます。

メインコードでは、すべてのN個の作業ユニットを入力キューに入れるだけです(十分な大きさであることを確認してください)。その後、出力キューでN個の出力を待つことができ、スレッド、結合、例外について心配する必要はありません。

[EDIT]すべてのご質問は、マイケル・スレイドは、提供されたリンクを読んだ後http://perldoc.perl.org/perlthrtut.html

+0

Aaron、私がスレッドを待っている理由は、現在どのフォームのデータも返さないためです。代わりに、彼らは仕事をしています。スレッドが終了すると、タスクが完了したことを意味します。タスクが長時間かかることがあるため、スレッドを見ている理由があります。タスクがタイムアウトした場合は、今すぐ終了するようスレッドに通知する必要があります。それでも安全に終了しない場合は、スレッドを強制終了する必要があります。これはスレッドとPerlに関する私の次の質問につながります。 Perlの割り込みのソースはどこにありますか?スレッドを停止、中止します... – pitchblack408

+0

確か:http://perldoc.perl.org/perlthrtut.html –

1

perlでスレッドを使用する場合は注意してください。共有データに安全にアクセスするには、多くのニュアンスがあります。ほとんどのPerlコードはスレッディングをしないので、スレッドセーフなモジュールはごくわずかです。

関連する問題