Каналы django долго не закрывались и были убиты ошибкой в бэкенде

Я использовал каналы django в этом проекте и создал потребителя в следующем коде:

class WSConsumer(WebsocketConsumer):

def connect(self):
    self.room_name = self.scope["url_route"]["kwargs"]["room_name"]
    self.stid=self.scope["url_route"]["kwargs"]["stid"]
    self.types=self.scope["url_route"]["kwargs"]["types"]

    self.room_group_name = f"station_{self.room_name}"

    if (self.types=="student"):
        try:
            workclass=WorkClass.objects.get(workclass_id=self.room_name)
            st=Station.objects.get(id=self.stid)
            if st in workclass.stations.all():
                st.state=True
                st.save()
                async_to_sync(self.channel_layer.group_add)(
                        self.room_group_name, self.channel_name
                )
                self.accept()
            else:
                self.disconnect(10)
        except WorkClass.DoesNotExist:
            self.disconnect(10)       
    elif(self.types=="teacher"):
        async_to_sync(self.channel_layer.group_add)(
            self.room_group_name, self.channel_name
        )
        self.accept()  
                   
        except WorkClass.DoesNotExist:
            raise StopConsumer()
        
    else:
        raise StopConsumer()
    

def disconnect(self, close_code):
  
    async_to_sync(self.channel_layer.group_discard)(
        self.room_group_name, self.channel_name
    )
    if(self.types=="student"):
        st=Station.objects.get(id=self.stid)
        st.state=False
        st.save()
        async_to_sync(self.channel_layer.group_send)(
            self.room_group_name,
            {"type":"list_stations","message":self.room_name,"roles":"stations"}
        )


async def websocket_disconnect(self, message):
    await self.channel_layer.group_send(
        self.room_group_name,
        {"type":"list_stations","message":self.room_name,"role":"stations"}
    )
    await super().websocket_disconnect(message)

def receive(self, text_data):
    text_data_json = json.loads(text_data)
    message = text_data_json["message"]
    role=text_data_json['roles']
    types=text_data_json['type']
    async_to_sync(self.channel_layer.group_send)(
        self.room_group_name,
        {"type":types,"message":message,"role":role}
    )
                  


# Receive message from room group
#list of method...

В настройках я использовал такую конфигурацию:

INSTALLED_APPS = [
'daphne',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',

 #apps
]

ASGI_APPLICATION = "backend.asgi.application"

CHANNEL_LAYERS = {
"default": {
    "BACKEND": "channels_redis.core.RedisChannelLayer",
    "CONFIG": {
        "hosts": [("127.0.0.1", 6379)],
    },
},
}

Проблема в том, что через некоторое время в терминале сервера появляется ошибка "took to long to shut down and was killed", это время переменное. Тем временем, я запускаю его на внешнем сервере, получая доступ через IP-адрес на другом компьютере. Сколько бы я ни гуглил и ни пробовал все решения, ничего не получалось.

Глядя на ваш код здесь, у вас есть WebsocketConsumer, который выполняется синхронно, то есть пытается использовать эту функцию отключения, которая вызывает async_to_sync.

Эта функция используется, когда мы хотим, чтобы асинхронная программа запускала синхронный процесс. Однако наша программа не является асинхронной.

Вместо объекта WebsocketConsumer здесь нужен объект AsyncWebsocketConsumer.

Пожалуйста, дайте мне знать, если это решит вашу проблему!

Вернуться на верх