0

現在、GPars に問題があります。約 30 のスレッドを開始したいのですが、各スレッドの開始後 1 秒待ちたいと考えています。

私のコードは現在、次のようになっています(Groovy/Grails):

withPool(30) {    // <= thread pool size
   Mail.findAllByStatus("new").eachWithIndexParallel { mail, i ->    // <= finds about 5000 mails
      sleep(i*1000)
      def doSomething = new Test()
      doSomething.do(mail) // <= runs for about 60sec
   }
}

このソリューションの問題は、「eachWithIndexParallel」がランダムな順序ですべてのスレッドを同時に開始することです。たとえば、5000 メールの場合:
スレッド 3500 を開始 = 3500 秒待機
スレッド 1000 を開始 = 1000 秒待機
....30 スレッドが開始されるまでスレッドが停止するのを待ちます

そして、私はこのような解決策が必要です:
スレッド 2500 を開始 = 1 秒待機
スレッド 5 を開始 = 2 秒待機
スレッド 4888 を開始 = 3 秒待機
...30 個のスレッドが開始されるまで、スレッドが停止するのを待ちます

カウント変数を使用するだけの場合、同時に開始するためにスレッドのカウント数が同じになるという問題があります...そして、各スレッド間に1秒の遅延があることが非常に重要です。

どうすればこの問題を解決できますか?

4

2 に答える 2

1

うーん、私はGParsの専門家ではありませんが、これはGParsの問題ではないと思います。スレッドがすべて呼び出す同期関数を作成して、遅延が何であるかを調べてはどうでしょうか。

private static delaycount = 1;
public synchronized int getMyDelay() {
   return delaycount++;
}

そして、次のようにコードを変更します。

int mydelay = getMyDelay()
sleep(mydelay*1000)
def doSomething = new Test()
doSomething.do(mail) // <= runs for about 60sec

Mail.find...の内部。

于 2011-07-10T16:12:52.437 に答える
0

または原子整数の使用

間違いなく遅延が重要な場合は、インデックスの値に依存しないでください。i は実際にはスレッドの列挙に使用する必要があります。

また、30 個のスレッドが停止して、n<30 である限り新しいスレッドが生成され続けるのを待つこともないと思います。

これはおそらく、1...30 秒の遅延で 30 スレッドを使用する利点を無効にします。

とにかくこれを強制するには、次のrequire delayを保持するキューが必要な場合があります。これにより、解放されたスレッドが1..30の未使用の数値から遅延xをフェッチします

于 2011-07-10T18:53:53.457 に答える