Есть 2 вещи, которые вы могли бы попытаться сделать здесь.
Однажды подписавшись и отправив эту информацию на все открытые соединения
, у вас возникла проблема pubsub.listen():
l oop навсегда (никогда не останавливаясь). Таким образом, ваш потребитель никогда не будет продолжать и сможет обрабатывать больше сообщений.
Поскольку (по крайней мере, в этом примере) похоже, что вы всегда нажимаете на redis со значениями stati c (независимо от запроса от пользователь) вам лучше делать эту подписку за пределами вашего потребителя. (в команде django https://docs.djangoproject.com/en/3.0/howto/custom-management-commands/)
Затем вы можете получить эту команду, а затем отправить эти сообщения по канальному уровню вашим подписанным потребителям.
это будет Сделайте так, чтобы ваш потребитель выглядел следующим образом
class EchoConsumer(AsyncJsonWebsocketConsumer):
async def on_message(self, message):
await self.send_json(message)
, затем в вашей команде управления instread of print вы можете отправить сообщение, используя
async_to_sync(channel_layer.group_send)(
"echo_group",
{"type": "on.message", "rate":Rate, "quantity": Quantity, "symbol": Symbol, "order": Order},
)
Подписавшись один раз на каждое открытое соединение
Это следует делать только в том случае, если вы ожидаете, что подписка будет отличаться для каждого подключения к веб-сокету. (например, вы используете значение в URL-адресе / запросе / заголовке или подписываетесь только тогда, когда пользователь отправляет сообщение ws вашему потребителю с заданным значением фильтра).
Выполнение этого является LOT
более сложным для несколько причин:
Redis не будет обрабатывать столько открытых соединений с ним, сколько у вас могут быть подключения через веб-сокет.
Вам необходимо настроить вложенная asyn c задача, которая может обрабатывать события от redis таким образом, чтобы они не блокировали остальную часть потребителя.
Если вам все еще нужна эта функция, я рад обновить ответ решением (но предупреждаю, что это будет долго).