0

私はリアルタイムデータグラバーに取り組んでいます。while True ループがあり、その中で比較的小さなタスクを実行するスレッドを生成します (HTTP 経由でサード パーティの API にクエリを実行し、高速化を達成するために並列でクエリを実行しています)。

すべてのスレッドは、特定のデータ系列を更新します。これには 2 秒、3 秒、さらには 5 秒かかる場合があります。ただし、while True ループは、スレッドが終了するのにかかる時間よりも速くスレッドを生成する可能性があります。したがって、生成されたスレッドが前のスレッドが終了するのを待つ必要があります。

一般に、スレッドは HTTP サーバーにクエリを実行するため、スレッドが完了するまでにかかる時間は予測できません...

すべてのスレッドに名前付きセマフォを作成することを考えていました。特定のシリーズ用に生成されたスレッドが、同じシリーズで動作している前のスレッドを見つけた場合、待機します。

私が見ることができる唯一の問題は、スレッドのバックログの可能性です..

ここでの最善の解決策は何ですか? セロリのようなものを調べる必要がありますか?現在、スレッドモジュールを使用しています。

ありがとう!

4

3 に答える 3

2

いいえ!あなたの神または知的なデザイナーの愛のために、それをしないでください! 継続的にスレッドを作成/生成/生成したり、それらを細かく管理しようとしたりしないでください。Threadpool - 起動時にいくつかのスレッドを作成し、これらのスレッドをプロデューサー/コンシューマー キューに渡して、それらの HTTP タスクを表すクラス インスタンスを待機させます。

于 2012-05-15T15:26:45.173 に答える
2

を使用する必要がありますQueue.Queue。シリーズごとにキューを作成し、そのキューでリッスンするスレッドを作成します。シリーズを読む必要があるたびに、リクエストをキューに入れます。スレッドはキュー内のアイテムを待機し、アイテムを受け取るたびにデータを読み取ります。

于 2012-05-15T15:26:58.180 に答える
0

クエリの 1 つが返されるたびに API を再クエリする場合に使用できる別のオプションは、Twisted (スレッドに関するチュートリアル) のような非同期フレームワークです。私は比較的 Twisted の初心者なので、これよりも Twisted を自分のタスクに合わせてひねるより良い方法があるかもしれません -

from twisted.internet import reactor, defer
def simple_task():
    status = query_your_api()
    return status

def repeating_call(status):
    print(status)
    d = threads.deferToThread(simple_task)
    d.addCallback(repeating_call)

data_series = [data1, data2, data3]
for data in data_series:
    repeating_call('starting everything up')

reactor.run()
于 2012-05-15T16:40:25.573 に答える