1

一度にいくつか実行したいタスクがたくさんあります。これに対する通常の解決策は、スレッド プールです。ただし、私のタスクには、特定のスレッドのみが持つリソースが必要です。したがって、タスクを古いスレッドにファームアウトすることはできません。スレッドには、タスクが必要とするリソースが必要です。

これには同時実行パターンがあるはずですが、見つけられないようです。私はマルチプロセッシングを使用してPython 2でこれを実装しているので、それらの用語での回答は素晴らしいでしょうが、一般的な解決策は問題ありません. 私の場合、「スレッド」は実際には個別の OS プロセスであり、リソースはネットワーク接続です (いいえ、サーバーではないため、(e)poll/select は役に立ちません)。一般に、スレッド/プロセスは複数のリソースを保持できます。

単純な解決策は次のとおりです。タスクを作業キューに入れ、スレッド プールを解放します。各スレッドに「このタスクを実行できますか?」とチェックしてもらいます。はいの場合は、実行してください。いいえの場合は、キューに戻します。ただし、各タスクを N 個のスレッドのうちの 1 つしか実行できない場合、1 つの作業単位を取得するためだけに、共有キューへのアクセスが 2N 回も無駄になり、コストが高くなります。

これが私の現在の考えです。各リソースに共有作業キューを用意します。一致するキューにタスクをファームアウトします。各スレッドは、処理できるキューをチェックします。

アイデア?

4

1 に答える 1

0

これに対する一般的なアプローチは、リソースをスレッドに割り当てず、適切なリソースをデータと共にキューに入れることですが、リソースが特定のスレッドにバインドされている場合、これが常に可能であるとは限りません。

リソースごとにキューを使用し、スレッドが処理できるオブジェクトを含むキューからオブジェクトをポップするだけというアイデアはうまくいくかもしれません。

リソースによってインデックス付けされた semaphore+concurrentQueue 配列を使用して、そのようなスレッドにシグナルを送信し、優先システムを提供して、ポーリングと無駄な再キューイングのほとんどを排除することができる場合があります。それについてはもう少し考える必要があります。リソースがスレッドにどのようにマップされるかによって異なります。

于 2012-06-16T21:19:59.207 に答える