Django channels 如何摆脱';僵尸';渠道

Django channels 如何摆脱';僵尸';渠道,django-channels,Django Channels,在Django通道文档()中有以下示例 class ChatConsumer(WebsocketConsumer): def连接(自): #使用我们的频道名称创建一个数据库行 Clients.objects.create(channel\u name=self.channel\u name) def断开连接(自身、关闭_代码): #请注意,在某些罕见的情况下(断电等),断开连接可能会失败 #运行;这个天真的例子会留下僵尸频道的名称。 Clients.objects.filter(channel\

在Django通道文档()中有以下示例

class ChatConsumer(WebsocketConsumer):
def连接(自):
#使用我们的频道名称创建一个数据库行
Clients.objects.create(channel\u name=self.channel\u name)
def断开连接(自身、关闭_代码):
#请注意,在某些罕见的情况下(断电等),断开连接可能会失败
#运行;这个天真的例子会留下僵尸频道的名称。
Clients.objects.filter(channel\u name=self.channel\u name).delete()
所以我对这张纸条感到担忧:

请注意,在某些罕见的情况下(断电等),断开连接可能会失败 #运行;这个天真的例子会留下僵尸频道的名称


对此我们能做些什么?是否有一种安全的方法来监控客户端是否仍处于连接状态,以及如果他不从数据库中删除记录?

上述情况非常罕见,但如果您想处理此类情况,一种方法是在服务器启动时从通道层清除所有通道数据。这样,如果断电,服务器离线,然后重新联机,它将在新连接到来之前删除所有“僵尸”频道名称!在通道名称上循环并检查客户端是否仍然处于活动状态是否合理可行?无需循环。就使用单个服务器实例而言,如果服务器脱机,则所有客户端都会断开连接。因此,当服务器再次启动时,您可以在它开始接受新连接之前删除所有通道名称。否则,没有其他方法可以真正知道它们是连接的,即使您要循环遍历这些名称