Django通道在组发送之间休眠

m4pnthwp  于 2023-01-06  发布在  Go
关注(0)|答案(1)|浏览(109)

我想实现的是很简单,因为你可以在标题中阅读,但我不能让它工作“两个发送之间的睡眠”.我的代码:

await self.channel_layer.group_send(
        str(self.game_link),
        {
            "type": "group_message",
            "text": json.dumps(answer_data),
        }
        )

        await asyncio.sleep(5)

        await self.channel_layer.group_send(
        str(self.game_link),
        {
            "type": "group_message",
            "text": json.dumps(data),
        }
        )

这里所发生的是在睡眠完成之后两者同时发送。

sdnqo3pr

sdnqo3pr1#

经过一些搜索和读取this SO post,我设法让它工作。

    • 简短回答**

await asyncio.sleep(5)放入group_message方法中

    • 请解释**

在等待group_send时,进程不是立即发送消息,而是发送到队列(针对组中的所有成员)。
由于这个进程还没有完成,所以这个通道在某种程度上被阻塞了,不能使用将来的消息,这个进程必须休眠5秒,等待另一个group_send,然后最后在它自己的队列中使用这两个消息。
如果您从其他位置加入通话组(例如,打开另一个浏览器),您将在5秒延迟后收到第二条信息。
另一方面,将await asyncio.sleep(5)放在group_message中,只会在使用消息时休眠。
注:添加过滤逻辑,以便不是所有消息都休眠

async def group_message(self, data):
    if 'sleep' in data:
        await asyncio.sleep(data.pop('sleep'))
    await self.send(text_data=data['text'])

在您的邮件发件人中:

await self.channel_layer.group_send(
    str(self.game_link),
    {
        "type": "group_message",
        "text": json.dumps(data),
    }
)

# second message: sleep before send
await self.channel_layer.group_send(
    str(self.game_link),
    {
        "type": "group_message",
        "text": json.dumps(data),
        "sleep": 5
    }
)

相关问题