потоковое представление с Джанго и Комбу - PullRequest
0 голосов
/ 09 июня 2011

у меня две очереди в комбу;один для отправки запросов (чтобы что-то сделать) и другой, который выплевывает через 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... '

, но я не могу представить, как можно реализовать обратный вызов сообщений очереди комбу в генератор, чтобы обеспечитьэто ... есть идеи?

Я хочу избежать использования слоя базы данных для хранения прогресса / результатов, если это возможно.

1 Ответ

0 голосов
/ 13 июня 2011

в итоге я решил немного реструктурировать код; поскольку у меня была оболочка для очереди комбу, чтобы сделать интерфейс более похожим на 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() )

есть многочисленные сообщения о том, как мешает различное промежуточное ПО; я просто не пытаюсь их использовать, и, кажется, все работает нормально.

...