Как обеспечить немедленную отправку сообщения Django Channels без задержки?

Идея состоит в том, чтобы запустить фоновую задачу на worker.connect воркере. При выполнении задачи я хотел бы отправить ее ход подключенному клиенту через группу уведомлений.

Проблема: сообщения, отправленные в группу уведомлений, задерживаются до завершения задачи на воркере. Итак: оба сообщения 'Старт' и 'Стоп' появляются на клиенте одновременно, с задержкой в ​​5 секунд (sleep(5)). Я ожидаю сообщения «Старт», за которым следует 5-секундная задержка, а затем сообщение «Стоп». Любая идея, почему это не так?

У меня запущены следующие три процесса:

  • daphne tests.asgi:channel_layer
  • python manage.py runworker --exclude-channel=worker.connect
  • python manage.py runworker --only-channel=worker.connect

In views.py:

def run(request, pk):
    Channel('worker.connect').send({'pk': pk})
    return HttpResponse(status=200)

In consumers.py:

def ws_connect(message):
    Group('notifications').add(message.reply_channel)
    message.reply_channel.send({"accept": True})

def worker_connect(message):
    run_channel(message)

In views.py:

def run_channel(message):
    Group('notifications').send({'text': 'Start'})
    sleep(5)
    Group('notifications').send({'text': 'Stop'})

routing.py

channel_routing = {
    'websocket.connect': consumers.ws_connect,
    'worker.connect': consumers.worker_connect,
}

person Joren Inghelbrecht    schedule 16.01.2017    source источник


Ответы (1)


Вы можете добавить immediately=True в качестве аргумента к функции send. Согласно источнику:

Отправка откладывается до завершения обработки потребителем. Чтобы переопределить это, вы можете передать немедленно = True.

https://github.com/django/channels/blob/master/channels/channel.py#L32

person Sander De Wilde    schedule 16.01.2017
comment
Это все еще применимо для Django Channels 2.0? Я не могу сразу увидеть arg в справочных документах @Sander - person dowjones123; 13.04.2018