1

メールボックス プロセッサ ループで、以前にそのようなコレクションに格納されていたブロッキング コレクション アイテムから読み取りました。このようなコレクションへの書き込みには同じループを使用するため、スレッドとして起動する必要があります。

async { process(queue.Take()) } |> Aysync.Start

私のコード全体の実行は遅く(比較的言えば)、原因は起動した新しいスレッドであると思われますが、スレッドプールをキックスタートしました

let toto = ThreadPool.SetMinThreads(300,300)

競合ポイントがここにある可能性を示すもう 1 つのヒントは、キューが空のときにのみ起動する (そしてセクション全体をロックする) 場合、実行時間は 350 ミリ秒から 7 秒まで大きく変化し、そうでない場合は約 5 秒になるということです。 10秒。

私の質問は次のとおりです。

  • とにかく、ここでスレッドの作成を加速できますか
  • メールボックスプロセッサ内で使用できる、この種の状況 (消費者/生産者?) をすでに処理する構造はありますか?
4

1 に答える 1

1

I / Oバウンド計算を実行するために数百のスレッドを作成する必要がある場合は、おそらく何か問題があります。計算がI/Oバウンドの場合、比較的少数のスレッドを使用して実行できるはずです。完全に非同期の場合は、待機中にスレッドがブロックされないことを意味します。

したがって、プログラムで最初に探すのは、スレッドがブロックされている場所であり、それを非同期の待機に置き換えることだと思います。

Takeコードサンプルの疑わしい点の1つはキューです。これは、少なくとも、呼び出したときにブロックされている可能性があります。これはBlockingCollection、.NETでの動作です。これをに置き換えてみることができますBlockingQueueAgent。これは、F#エージェントを使用して同じ機能を実装しますがAsyncTake、スレッドをブロックせずに呼び出すことができる非同期メソッドを提供します。

于 2012-04-02T11:00:50.300 に答える