0

昆布には 2 つのキューがあります。1 つは (何かをするために) リクエストを送信するためのもので、もう 1 つは pub/sub を介してそのリクエストの増分ステータスを吐き出すものです。したがって、私のプロセスでは、リクエストキューに公開され、レスポンスキューで消費されます。タスクには時間がかかる場合があるため、バックエンドで何が起こっているかについてユーザーにフィードバックを提供したいと考えています。kombuコールバックを使用すると、たとえば、ユーザーに情報を吐き出すステートメントをconsume追加できるため、すべてコマンド ラインで機能します。logging.info()

def callback( msg, env ):
    logging.info( str(msg) )

consumer.register_callback( callback )
consumer.consume()
while continue_consuming:
    connection.drain_events()

ただし、django で同じ機能を提供できるようになりたいと考えています。オブジェクトgeneratorへの入力として関数を作成できることを理解しています。HttpResponse

def view( reqeust ):
    HttpResponse( gen() )

def gen():
    yield 'streaming... '

しかし、昆布キューのメッセージコールバックをジェネレーターに実装してこれを提供する方法を概念化することはできません...何かアイデアはありますか?

可能であれば、データベース層を使用して進行状況/結果を保存する必要はありません。

4

1 に答える 1

0

最後に、コードを少し再構築することにしました。インターフェイスをより似たものにするために昆布キューのラッパーを持っていたのでmultiprocess.Queue、メソッドのジェネレーターを作成しましたget()

def get( self, until=None ):
    if until == None:
        until = self.end_marker
    for c in count():
        m = self.consumer.queues[0].get( True )
        if not m == None:
            if m.payload == until:
                raise StopIteration
            yield m.payload

self.end_markerこれは正常に機能しているように見えますが、何が何であるかを知る必要があり、すべてのコンシューマー キューを反復処理する必要があるため、それほどきれいでutilはありません (ただし、私のクラスはとにかくオブジェクトごとのキューであるため、それほど悪くはありません)。

次に、私の見解で行うことは次のとおりです。

 def view( response ):
     q = Queue()
     return HttpResponse( q.get() )

さまざまなミドルウェアが邪魔をしているという投稿が多数あります。私はそれらを使用することを気にせず、うまく機能しているようです。

于 2011-06-13T18:01:38.433 に答える