【问题标题】:How do I ensure a Django Channels message is sent immediately without delay?如何确保立即立即发送 Django Channels 消息?
【发布时间】:2017-05-31 18:10:46
【问题描述】:

这个想法是在worker.connect worker 上运行一个后台任务。在执行任务时,我想通过通知组将其进度发送到连接的客户端。

问题:发送到通知组的消息被延迟,直到工作人员的任务完成。因此:延迟 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

views.py:

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

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)

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,
}

【问题讨论】:

    标签: django django-channels


    【解决方案1】:

    您可以将immediately=True 作为参数添加到send 函数。根据消息来源:

    发送延迟到消费者完成。要覆盖它,您可以立即传递=True。

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

    【讨论】:

    • 这仍然适用于 Django Channels 2.0 吗?我无法立即在帮助文档中看到 arg @Sander
    猜你喜欢
    • 2015-08-25
    • 1970-01-01
    • 2023-01-09
    • 2020-12-28
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多