Django WebSocket不在组内发送即时消息

fivyi3re  于 2023-02-14  发布在  Go
关注(0)|答案(1)|浏览(150)

我有一个WebSocket,应该每x秒发送一次消息。我从两个客户端连接到这个套接字。当其中一个客户端发送一个启动消息时,这个套接字应该向两个客户端都发送消息,但是只有没有启动的那个客户端每x秒收到一次消息。发送消息的那个客户端在所有时间过去后收到所有消息
这是一个循环。正常的发送是获取发送瞬间到一个初始化发送的人(我现在使用这个作为一个半修复)。我的问题是,发送到组不是每x秒发送一次,因为它应该。只有其他连接的客户端是每秒钟获得它。开始的人是在时间过去后一次获得所有

async def init_starting(self):
    if not self.lobby.status == "waiting":
        print("Already Started")
        return False
    else:
        print("Starting Countdown")

        #self.lobby.status = 'starting'
        #await self.save_lobby()

        await self.send_status_message_with_status(status='starting', data={'has_started': self.lobby.has_started,
                                                                            'host': self.host.username,
                                                                            'players': self.players,
                                                                            'lobby_code': self.lobby_code,
                                                                            'countdown': 3})
        countdown = 3
        while countdown >= 0:
            countdown_data = {
                'countdown': countdown
            }
            await self.send(json.dumps({"type": "msg", "message": countdown}))
            await self.send_status_message_with_status(status='starting', data=countdown_data)
            print(countdown)
            countdown -= 1
            await asyncio.sleep(1)

        await self.send_status_message_with_status(status='started', data={
            'message': "Test"
        })

        return True

    async def send_status_message_with_status(self, status, data):
    send_data = {
        'type': 'status',
        'status': str(status),
    }

    send_data = send_data | data
    await self.channel_layer.group_send(
        self.lobby_group_code,
        send_data
    )

上面的发送正在工作,下面的一次全部进来了。(在启动客户端)

这是另一个没有启动的客户端。这里是每秒钟后进来的所有消息,所以它应该正常工作。

我怎样才能让双方的群发都是即时的,或者有其他方法可以解决这个问题?

zbdgwd5y

zbdgwd5y1#

目前尚不完全清楚是什么原因导致启动客户端一次接收所有消息。但是,您可以尝试将await self.channel_layer.await self.channel_layer.group_send调用 Package 在1asyncio.ensure_future1任务中。这将在单独的任务中异步运行组发送,因此不会阻塞当前任务,并且消息应立即发送到两个客户端。
下面是一个例子:

async def send_status_message_with_status(self, status, data):
    send_data = {
        'type': 'status',
        'status': str(status),
    }
    send_data.update(data)
    asyncio.ensure_future(self.channel_layer.group_send(
        self.lobby_group_code,
        send_data
    ))

相关问题