質問

現在、多くのC#計算(メソッドの呼び出しにお住まいの方にいるキューで実行されます。各計算用の高速サービス(ネットワーク、ディスク...).

たちの利用モノcoroutinesを次の計算の計算のキューの継続を前に計算されますので高レイテンシーを返します。しかし、好に影響を及ぼす可能性がありMono coroutines.

あるデザインパターンの導入可能な純粋なC#ることによっ過程で追加の計算がで高レイテンシーサービスを組みます。

感謝

更新:

私は実行する必要は膨大な数(>10000)の課題は、各サービスを提供することを高いレイテンシーサービスです。Windowsできませんの作成に多くのスレッド)。

更新:

うちは基本的に必要なデザインパターンemulatesのメリットとして以下のtaskletsにStackless Python(http://www.stackless.com/)

  1. 大の課題
  2. 場合はタスクのブロックの中で次のタスクのキューの実行
  3. 無駄のないcpuサイクル
  4. 最小限の頭を切り替え作業
役に立ちましたか?

解決

あなたはIEnumerableをを使用して協力microthreadingをシミュレートすることができます。残念ながら、これはAPIを遮断すると動作しませんので、あなたは、あなたがポーリングできるAPIを見つける必要がある、またはそのあなたがシグナリングのために使用できるコールバックを持っています。

タグの方法を考えてみましょう
IEnumerable Thread ()
{
    //do some stuff
    Foo ();

    //co-operatively yield
    yield null;

    //do some more stuff
    Bar ();

    //sleep 2 seconds
    yield new TimeSpan (2000);
}

C#コンパイラは、状態マシンにこれをアンラップします - しかし、外観は協同マイクロスレッドのものである

のパターンは非常に簡単です。あなたはすべてのアクティブIEnumeratorsのリストを保持「スケジューラ」を実装します。リストを通してサイクルとして、それは「ラン」MoveNextメソッドを使用してそれぞれの()。 MoveNextメソッドの値がfalseの場合、スレッドは終了しました、そしてスケジューラは、リストから削除します。それが本当ならば、スケジューラは、スレッドの現在の状態を判断するために、現在のプロパティにアクセスします。それはのTimeSpanだ場合は、スレッドがスリープ状態に願い、そしてスケジューラは、バック睡眠のタイムスパンが終了しているメインリストに洗い流すことができるいくつかのキューにそれを移動します。

あなたは他のシグナル伝達機構を実装するために他の戻りオブジェクトを使用することができます。例えば、WaitHandleのいくつかの種類を定義します。スレッドはこれらのいずれかを生成する場合はハンドルが通知されるまで、それは待機キューに移動することができます。それとも、待機ハンドルの配列をもたらすことにより、WaitAllをサポートすることができました。あなたも、優先順位を実装することができます。

私は約150LOCにこのスケジューラの簡単な実装をしましたが、私はまだコードをブログにラウンド持っていません。それは私たちのデモの一つに百文字のカップルを制御するためにかなりよく働くようで、私たちPhyreSharp PhyreEngineラッパー(公開されません)、のためでした。我々はUnity3Dエンジンから概念を借りた - 彼らは、ユーザの観点から、それを説明するいくつかのオンラインドキュメントを持っている。

他のヒント

私はスレッドプールタスクキューのオフフィードアクティブなタスクのリストを使用して管理し、バッチで一度にあなたのキューから複数のタスクを実行する。

このシナリオでは、あなたのメインのワーカースレッドは最初(最も可能性が高いのhref = "http://msdn.microsoft.com/en <使用してスレッドプールに派遣されるアクティブなタスクリストにキューからN個のタスクをポップうNは、スレッドプールを過負荷にならない管理可能量を表し-us /ライブラリ/ system.threading.threadpool.queueuserworkitem.aspx」のrel = 『nofollowをnoreferrer』> QueueUserWorkItem のは)、スレッドを使ってアプリを行き詰まらスケジューリングと同期コスト、または起因する各タスクの組み合わせI / Oメモリのオーバーヘッドに使用可能なメモリを吸うます。

たびタスク信号完了ワーカースレッドに、あなたはアクティブなタスクリストから削除して、実行すべきタスクキューから次のものを追加することができます。

これは、あなたのキューからNタスクのローリングセットを持つことができるようになります。あなたはパフォーマンス特性に影響を与えるし、あなたの特定の状況で最善であるものを見つけるためにNを操作することができます。

あなたは最終的に、ハードウェアの操作がボトルネックされているので、

(ディスクI / O、ネットワークI / O、CPU)私は小さいが優れていると想像します。ディスク上で動作する2つのスレッドプールのタスクI / O最も可能性の高いものよりも速く実行されません。

また、タスクの特定の種類のセット数にそれを制限することにより、大きさとアクティブタスクリストの内容を柔軟に実装することができます。あなたは4つのコアを持つマシン上で実行している場合たとえば、あなたは最高性能の構成は、4つのCPUバウンドのタスクが一つのディスクバウンドのタスクおよびネットワークタスクと一緒に同時に実行されることがあります。

すでに一つのタスクは、ディスクIOタスクとして分類している場合は、

、あなたはそれが別のディスクIOのタスクを追加する前に完了するまで待つことを選択することができ、あなたはその間にCPUバウンドまたはネットワーク結合タスクをスケジュールすることもできますます。

これは理にかなって願っています!

PS:あなたは、タスクの順序で任意の依存関係を持っていますか。

あなたは間違いなく同時実行性と協調ランタイムにチェックアウトする必要があります。そのサンプルの一つは、あなたが話している正確に何を説明します。あなたは、長い待ち時間のサービスを呼び出すと、あなたが待っている間、CCRは、効率的に実行するためにいくつかの他のタスクを可能にします。あなたがそれを求めるなら、それはすべてあなたのコアを使用しますけれども、それは、それぞれのためのスレッドを生成する必要はありませんので、それは仕事の膨大な数を扱うことができます。

これは、マルチスレッド処理の従来の使用ではないですか?

の<ここで、このような原子炉などのパターンを見てください/ P>

非同期IO に使用するためにそれを書きます十分かもしれません。

これはデザインに強い構造ずにデバッグコードにハード、nasyにつながることができます。

あなたはこれを見て取る必要があります:

http://www.replicator.org/node/80する

このは正確にあなたが欲しいものを行う必要があります。これは、しかし、ハックされます。

.NETで実装に対する(別のポスターが言及されるように)「反応性」パターンに関するいくつかの詳細。別名 "イベントへのLINQの"

http://themechanicalbride.blogspot.com /2009/07/introducing-rx-linq-to-events.htmlする

-Oisin

あなたが仕事のために一つのスレッドを使用する場合は、

実際には、あなたはこのゲームを失うことになります。 Node.jsのはconectionsの膨大な数をサポートできる理由を考えてみてください。非同期IOとスレッドの数の数を使用して!非同期および機能は、この上で役立つことができます待っています。

foreach (var task in tasks)
{
    await SendAsync(task.value);
    ReadAsync(); 
}

SendAsync()とReadAsync()はIO呼び出しを非同期する機能を偽造している。

タスク並列にも良いです選択します。しかし、私は速くなるかわからないです。あなたはそれらの両方をテストすることができます あなたの場合ます。

はい、もちろん、あなたはできます。あなたはちょうどあなたが提供してキューに入りラムダにコールバックしますディスパッチャのメカニズムを構築する必要があります。私は団結で書くすべてのコードは、このアプローチを使用して、私はコルーチンを使用することはありません。私はちょうどそれを取り除くために、このようなWWWのものとしてコルーチンを使用する方法を包みます。少ないオーバーヘッドがあるので理論的には、コルーチンは高速になります。実際に、彼らはかなり簡単な作業を行うために、言語に新しい構文を導入し、あなたが表示されますすべてがあるので、さらに、あなたは共同ルーチンでエラーに適切にスタックトレースをたどることができない - >次。その後、別のスレッド上のキューにタスクを実行する機能を実装する必要があります。しかし、最新の.NETでの並列機能があり、あなたは、本質的に同様の機能を書いているはずです。それは本当に、コードの行数ではありません。

誰もが興味を持っている場合は、

私は私にそれを持っていない、コードを送信します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top