如何确保 Django Channels 消息立即发送而不会延迟?

2023-12-13

这个想法是在后台运行一个任务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,
}

你可以加immediately=True作为论据send功能。据消息来源称:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何确保 Django Channels 消息立即发送而不会延迟? 的相关文章

随机推荐