Django Channels中send_bulkledger函数为何被多次调用?
Django Channels中send_bulkledger被多次调用的原因分析
问题场景
运行以下Django Channels代码时,控制台仅打印一次6000,但多次打印7000,疑惑send_bulkledger函数为何被多次调用:
if main1['res']['message']['module'] == 'bulk_ledger_save': ledger_list = await self.save_bulk_ledger(main1) # returns a list print('6000') msgdict = {"msg":"bulk_legder_return", "ledger_list": ledger_list} await self.channel_layer.group_send(self.room_group_name, {"type":"send_bulkledger", 'msg':msgdict}) async def send_bulkledger(self, event): print(event, '7000') data = event['msg'] await self.send(text_data=json.dumps({"msg":data}))
核心原因
channel_layer.group_send的作用是给指定分组内的所有在线WebSocket连接各发送一次消息:
- 你只执行了一次
group_send调用,所以6000只会打印一次 - 但如果
self.room_group_name对应的分组里有N个活跃的客户端连接,Channels就会为每个连接触发一次send_bulkledger函数,因此7000会打印N次
验证与调整思路
- 可以在调用
group_send前加入代码print(await self.channel_layer.group_channels(self.room_group_name)),直接查看当前分组内的所有连接ID,确认连接数量 - 如果只想给发起请求的当前客户端返回消息,无需使用分组广播,直接调用
await self.send(...)即可
内容的提问来源于stack exchange,提问作者ddspl. staff
相关产品推荐
相关产品推荐

