7

私は膨大な量のスレッドを開始するプログラム(Perl)を持っています(それぞれがデータ処理に基づいてグラフィックを作成することを担当しています)。私が使い始めた各スレッド:

my @threads //list to store threads that have been launched

push @threads,threads->create(\mySubName,params...);

スレッドは正しく起動しますが、しばらくすると、いくつかのスレッドを開いた後、Perlインタープリターがクラッシュします(メモリに関連していると思いますか?)。したがって、私の解決策は、一度に開くスレッドの数を制限することです。15を選択しました。そして、各作成行の前にサブを追加して、次のスレッドを起動するか、待機中にスリープを実行してもよいかどうかを確認します。 1つを終了します。これが私がやろうとした方法です。

sub checkThreads{
    my $addThread = 0;
    until($addThread){
        my $totalThreads = 0;
        foreach my $task (@threads){
            if($task->is_running()){$totalThreads++;}
        }
        if($totalThreads <= 15 ){
            print "Ok to add new thread, carry on!\n";
            $addthread = 1;
        }else{
            print "Waiting for $totalThreads threads to fire next one...\n";
            sleep 2;
        }
    }
}

したがって、新しいスレッドを作成するたびに、

&checkThreads;

そして、いくつかのスレッドがクリーンアップされるのを待つ間、遅延を作成するように注意します。問題は、私がそのサブを呼び出すとき、私がチェックするラインに到達した瞬間です:

$task->is_running()

プログラムは終了し、エラーや警告なしに実行を停止します。実行中のスレッドをカウントして制限するサブが必要です。

このカウントを正常に実行するにはどうすればよいですか?

私が試した他のことは、次の行を評価することです。

scalar(threads->list());

しかし、それは私に奇妙な価値を与えます。それは私が信じている祝福されていない参照であるように、次のようになります。

threads=SCALAR(0x80fea8c)
4

3 に答える 3

6

Thread :: Semaphoreは、同時実行を制限するためのカウントセマフォを提供します。

my $sem = Thread::Semaphore->new(15); # max 15 threads
my @threads = map {
    # request a thread slot, waiting if none are available:
    $sem->down;
    threads->create(\&mySubName, @params)
} 0..100;
$_->join for @threads;

そしてあなたの機能では:

sub mySubName {
    do_stuff();
    # release slot:
    $sem->up;
}
于 2012-07-22T01:55:32.060 に答える
1

ドキュメントを見て、

my $count = threads->list();

あなたの言うことに反して、うまくいくはずです。使用しているスレッドのバージョンのドキュメントは何と言っていますか?さて、あなたは回避策として以下を使うことができます。

my $count = () = threads->list();
于 2012-07-22T01:28:02.123 に答える
0
man perlthrtut

What Threads Are Running?
   "threads->list()" returns a list of thread objects, one for each thread
    that's currently running and not detached.  Handy for a number of

言い換えると、threads-> list()が返すリスト内のアイテムの数を調べて、カウントを取得します。

Thread :: Poolまたは他のcpanパッケージを調べて、他の誰かがすでにあなたのために手間のかかる作業を行っているかどうかを確認することをお勧めします。

于 2012-07-22T00:50:46.950 に答える