コンシューマー/プロデューサーの問題:遅い消費の一時停止の生産

デニスKulagin:

私が持っているプロデューサー、ディスクからのテキストのブロックを読み込みます。複数の消費者はそのブロックの計算を行っています。

私はより多くのことがある場合は、ディスクからデータを読み込む一時停止するプロデューサーをしたいと思いn個のブロックが現在以上に計算されています。

持っているが、私が達成したいものを説明するために擬似コードでそれを置きます。

// "produceBlocks" reads blocks from disk one by one
// and feeds them to lambda
produceBlocks(block -> {
  // (!) if activeCounter exceeds a THRESHOLD, then pause

  executorService.submit(() -> { 
     activeCounter.incrementAndGet();

     // do some work

     activeCounter.decrementAndGet();
  });
});
Alexei Kaigorodov :

「私は、n個のブロックが現在以上に計算されている多くのことがある場合は、ディスクからデータを読み込む一時停止するプロデューサーをしたいと思います。」実際のタスクdescritionは若干異なります。プロデューサーは、ディスクからデータを読み込む前に、そうする許可をAQUIRE必要がありますあなたのプロデューサーがスレッドである場合は、許可を管理するための自然な施設があるセマフォで初期状態ではn個の許可が含まれています。プロデューサーは、ブロックを読み取るために、と1つの許可証をaguires Semaphore::aquireブロックは、消費者によって処理されると、消費者が持つ1つの許可証をリリースSemaphore::release

別のアプローチは、ブロックと許可を組み合わせることです。生産者から消費者への出力キューにSimilary、ブロックのキューをブロック入力を作成します。Initualy n個のブロックをそこに置か。生産者は、最初にそのキューから次のブロックを取り、ブロックを読み取ります。消費者は、ブロックを処理した後、入力キューに戻します。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=205244&siteId=1