gpt4 book ai didi

python - Django channel 页面卡在加载中

转载 作者:行者123 更新时间:2023-12-03 06:42:36 25 4
gpt4 key购买 nike

我创建了一个简单的 Django Channels 消费者,它连接到 Redis channel 并从该 channel 接收一些数据,我想将此数据发送到前端。

消费者能够连接到消费者并接收数据;问题是,如果我在消费者运行时尝试加载页面,页面将在加载时卡住。我确定这是因为与 Redis channel 的连接是阻塞操作,或者可能是线程问题。我对这个概念很陌生,所以我决定提出一个问题。

这是我的消费者:

class EchoConsumer(AsyncConsumer):

async def websocket_connect(self, event):
self.send({
'type': 'websocket.accept'
})

self.receive(event)

def receive(self, event):
redis_url = 'redis://localhost:6379/0'
connection = redis.StrictRedis.from_url(redis_url, decode_responses=True)
channel = 'TEST'
params = urllib.parse.parse_qs(self.scope.get('query_string', b'').decode('utf-8'))

pubsub = connection.pubsub(ignore_subscribe_messages=True)
pubsub.subscribe(channel)

for message in pubsub.listen():

# self.send({
# 'type': 'websocket.send',
# 'text': message['data'],
# })

print(message['data'])


async def websocket_disconnect(self, event):
print('DISCONNECTED!')

所以发生的情况是我可以看到正在打印到我的控制台的数据,但是如果我尝试离开该页面并到达我网站的不同部分,该页面将在加载时卡住。谁能帮我解决这个问题?

最佳答案

您可以在这里尝试做两件事。

订阅一次并将此信息发送到所有打开的连接

您遇到的问题是 pubsub.listen():将永远循环(永不停止)。因此,您的消费者将永远不会继续并且能够处理更多消息。

因为(至少在这个例子中)看起来你总是用静态值(不依赖于用户的请求)点击 redis,你最好在你的消费者之外进行这个订阅。 (在 django 命令中 https://docs.djangoproject.com/en/3.0/howto/custom-management-commands/ )

然后,您可以使用该命令通过 channel 层将这些消息发送给订阅的消费者。

这将使您的消费者看起来像这样

class EchoConsumer(AsyncJsonWebsocketConsumer):
async def on_message(self, message):
await self.send_json(message)


然后在打印的管理命令中,您可以使用


async_to_sync(channel_layer.group_send)(
"echo_group",
{"type": "on.message", "rate":Rate, "quantity": Quantity, "symbol": Symbol, "order": Order},
)

为每个打开的连接订阅一次

仅当您希望每个 websocket 连接的订阅都不同时,您才应该这样做。 (例如,您在 url/query/headers 中使用一个值,或者仅在用户使用给定过滤器值向您的消费者发送 ws 消息时订阅)。

这样做是一个 LOT更复杂的几个原因:
  • Redis 不会像你可以拥有 websocket 连接那样处理尽可能多的打开连接。
  • 您需要设置一个嵌套的异步任务,该任务可以处理来自 redis 的事件,这样它们不会阻塞其余的使用者。

  • 如果您仍然需要此功能,我很乐意用解决方案更新答案(但警告它会很长)。

    关于python - Django channel 页面卡在加载中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61118904/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com