2016-08-13 2 views
1

私は、複数のスレッドと各スレッドが時間を消費するperlアプリケーションを作成しています。これは私がこれまでPerlどのように他のスレッドを継続しながらperlで '不正な'スレッドを削除する

use strict; 
use warnings; 
use threads; 

my @file_list = ("file1", "file2", "file3"); 
my @jobs; 
my @failed_jobs; 
my $timeout = 10; #10 seconds timeout 

foreach my $s (@file_list){ 
    push @jobs, threads->create(sub{ 
     #time consuming task 
    }) 
} 

$_->join for @jobs; 

問題は時間のかかる作業が時々動けなく(または実行に時間の$タイムアウト秒以上かかる)ことである持っているものです。だから、私はファイルの名前を取得し、それを@failed_jobsにプッシュし、そのスレッドを終了したいと考えています。しかし、私は他のスレッドを続行したい。すべてのスレッドが終了または完了すると、終了します。

これを達成するために上記のコードを変更する方法を教えてもらえますか?

おかげ

+0

同時にすべてのスレッドを開始している場合は、同時にすべてのタイムアウトが発生するため、他のスレッドがタイムアウトしている間は、実際には発生しません。 – hobbs

+0

あなたは[The Fine Manual](http://perldoc.perl.org/threads.html)に時間をかけましたか? Perlのインタプリタスレッドを使用することはお勧めできませんので、そのページとそのすべての注意点に精通している必要があります。スレッドシグナリングに関するセクションは、あなたの質問にとって特に重要です。優秀な既存の文書を複製することはできません。 –

+0

@ジムギャリソン、このマニュアルはこの問題については言及していません。仮想信号を送信することはできますが、プロセスがXSライブラリの正規表現でスタックしている場合は役に立ちません。 //軽いスレッドが必要な場合に限って、Perlスレッドは推奨されません。そのテキストは誤解を招き、パッチを必要としています。前段落を補強していると思われます。 – ikegami

答えて

1

タスクを殺す能力をしたい場合は、スレッドが、プロセスを望んでいません。

関連する問題