You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 16:43:13