如何确保 Django Channels 消息立即无延迟地发送?
How do I ensure a Django Channels message is sent immediately without delay?
这个想法是 运行 worker.connect
工作人员的后台任务。在执行任务时,我想通过通知组将其进度发送到连接的客户端。
问题:发送到通知组的消息被延迟,直到工作人员的任务完成。因此:消息 'Start' 和 'Stop' 在延迟 5 秒 (sleep(5)
) 后同时出现在客户端上。我希望消息 'Start',然后是 5 秒的延迟,然后是消息 'Stop'。知道为什么不是这种情况吗?
我有以下三个进程运行ning:
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,
}
您可以添加 immediately=True
作为 send
函数的参数。据消息来源:
Sends are delayed until consumer completion. To override this, you may pass immediately=True.
https://github.com/django/channels/blob/master/channels/channel.py#L32
这个想法是 运行 worker.connect
工作人员的后台任务。在执行任务时,我想通过通知组将其进度发送到连接的客户端。
问题:发送到通知组的消息被延迟,直到工作人员的任务完成。因此:消息 'Start' 和 'Stop' 在延迟 5 秒 (sleep(5)
) 后同时出现在客户端上。我希望消息 'Start',然后是 5 秒的延迟,然后是消息 'Stop'。知道为什么不是这种情况吗?
我有以下三个进程运行ning:
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,
}
您可以添加 immediately=True
作为 send
函数的参数。据消息来源:
Sends are delayed until consumer completion. To override this, you may pass immediately=True.
https://github.com/django/channels/blob/master/channels/channel.py#L32