Функция group_send в каналах Django вызывает проблемы

Контекст: Я делаю приложение для обмена сообщениями в Интернете, в котором я использую Django для бэкенда. Для параллелизма я использую websockets (каналы). Так вот, для управления группами пользователей (канальный слой) я использую следующую логику. Будет два типа групп, "чаты" и "уведомления". Группы уведомлений - это группы из 1 пользователя и 1 имени_канала, они используются для отслеживания подключения пользователя, они имеют следующий вид:

{user_id} : [‘{channel_name}’]

Пример: ‘30’: [‘specific.363469477d6745289c5bc679b7947790!d813479fc71448d49592711a7f823e06’]

С другой стороны, чат-группы будут использоваться для отслеживания присутствия пользователей в чатах, и сообщать о таких событиях, как "запись", "подключение или отключение", "обновление", "новые сообщения", и т.д. ... На уровне группы они имеют следующий вид: {id_minor}-{id_major} : [‘{channel_of_id_1}, {channel_of_id_2}’]

Пример: ‘1-30’: [‘specific.363469477d6745289c5bc679b7947790!d813479fc71448d49592711a7f823e06’]

Примечание: в групповых чатах может быть максимум 2 участника, т.е. если пользователь 1 присоединяется к чату с 2, то структура будет выглядеть следующим образом... 1-2‘ : [’{channel_name_of_1}"].

Если 2 входит в чат с 1, то структура будет такой... ‘1-2’ : [‘{channel_name_of_2}’]

А если оба находятся в чате... ‘1-2’ : [‘{channel_name_of_2}, {channel_name_of_1}’]

Проблема: в приложении django у меня есть следующая функция ...

logger = logging.getLogger('django.channels')
async def broadcast_connection_inform(user_id, connected):
    broadcast_data =  {
            'type' : 'broadcast_connection_inform_handler',
            'value' : {
                "user_id" : user_id,
                "connected" : connected
            }
        }
    opened_chat_groups = get_opened_chat_groups_with_id(str(user_id))
    if (opened_chat_groups):
        for group in opened_chat_groups:
            logger.info(f"Haciendo broadcast a {group}:{get_redis_groups('chats')[group]} por connection inform")
            await get_channel_layer().group_send(group, broadcast_data)
    return

Идея этой функции заключается в том, что, когда пользователь с идентификатором X отключается от сети, во всех группах чатов, открытых с этим идентификатором, производится поиск предупреждений о том, что этот идентификатор отключен.

Ну, вот в чем проблема...

Application instance \<Task pending name='Task-35' coro=\<StaticFilesWrapper.__call__() running at /home/santiago/Escritorio/Projects/FriendNet/dependencies/lib/python3.8/site-packages/channels/staticfiles.py:44\> wait_for=\<Task pending name='Task-37' coro=\<RedisChannelLayer.receive() running at /home/santiago/Escritorio/Projects/FriendNet/dependencies/lib/python3.8/site-packages/channels_redis/core.py:353\> wait_for=\<Future pending cb=\[\<TaskWakeupMethWrapper object at 0x7f99542952b0\>()\]\> cb=\[\<TaskWakeupMethWrapper object at 0x7f9954e912b0\>()\]\>\> for connection \<WebSocketProtocol client=\['127.0.0.1', 43494\] path=b'/ws/notifications/1/'\> took too long to shut down and was killed.

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

Наглядный пример:

{'30': ['specific.37ae0c3238cb486f960ee392cb64326a!49d141b1ed0f4e2f94f5b0cc360244ef'], '1': ['specific.37ae0c3238cb486f960ee392cb64326a!36dd5b94be0641b7a196534cc22b56dc']}
{'1-30': ['specific.37ae0c3238cb486f960ee392cb64326a!49d141b1ed0f4e2f94f5b0cc360244ef']}


WebSocket DISCONNECT /ws/notifications/1/ [127.0.0.1:43494]

Broadcast to 1-30:['specific.37ae0c3238cb486f960ee392cb64326a!49d141b1ed0f4e2f94f5b0cc360244ef'] by connection inform


{'30': ['specific.37ae0c3238cb486f960ee392cb64326a!49d141b1ed0f4e2f94f5b0cc360244ef']}
{'1-30': ['specific.37ae0c3238cb486f960ee392cb64326a!49d141b1ed0f4e2f94f5b0cc360244ef']}

Broadcast connection inform success !!


**( 10 seconds later )**


Application instance <Task pending name='Task-35' coro=<StaticFilesWrapper.__call__() running at /home/santiago/Escritorio/Projects/FriendNet/dependencies/lib/python3.8/site-packages/channels/staticfiles.py:44> wait_for=<Task pending name='Task-37' coro=<RedisChannelLayer.receive() running at /home/santiago/Escritorio/Projects/FriendNet/dependencies/lib/python3.8/site-packages/channels_redis/core.py:353> wait_for=<Future pending cb=[<TaskWakeupMethWrapper object at 0x7f99542952b0>()]> cb=[<TaskWakeupMethWrapper object at 0x7f9954e912b0>()]>> for connection <WebSocketProtocol client=['127.0.0.1', 43494] path=b'/ws/notifications/1/'> took too long to shut down and was killed.

Обратите внимание, что эта же функция (broadcast_connection_inform) выполняется и при подключении пользователя, и в этом случае она прекрасно работает. Код потребителя:

`

Любая помощь будет очень признательна.

Я перепробовал все

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