4

QT アプリケーションの requests モジュールのジェネレーター関数を使用しています。これは、要求ストリーミングの例とほとんど同じです。

import json
import requests

def get_stream():
    r = requests.get('http://httpbin.org/stream/20', stream=True)
    for line in r.iter_lines():
        if line:
            yield json.loads(line)

def consume_stream():
    for message in get_stream():
       #do something

ただし、着信応答がない場合 (Twitter のストリーミング API から不定期に着信するツイート)、ジェネレーターはメソッドget_streamをブロックしconsume_streamます。

これは、ジェネレーターがすぐに譲歩せず、受信メッセージなどを待たなければならない状況で発生する可能性があり、したがってコンシューマーをブロックします。

ジェネレーターをブロックしない方法で消費できる Python のパターンはありますか?

4

4 に答える 4

1

Simeon がコメントで質問しているように、例で説明しているほど単純には機能しません。あなたが世話をしなければならないかなりの詳細があります。ユースケースに応じて、多かれ少なかれ理にかなっているさまざまなソリューションがあります。あなたが本当にやりたいことについてあまり詳しく説明していないので、例としてhttp://twistedmatrix.com/trac/wiki/QTReactorにお送りします。非同期メッセージ キューを実装するさまざまなソリューション/フレームワークがあります。そして、それがあなたが探しているものだと思います。

于 2013-11-01T22:45:56.303 に答える
1

ジェネレーター関数を制御する場合、1 つの解決策は、タイムアウト期間後に例外をスローすることです。おそらく、次のようなものです。

def get_stream(timeout=None):
    while message=read_message(timeout=timout):
        yield message

次に、タイムアウト条件が発生した場合に read_message に TimeOutException などをスローさせます。

もちろん、いつ/どのように再試行/再開するかというロジスティクスに対処する必要があります。

于 2013-11-02T02:54:09.343 に答える