Функция 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) выполняется и при подключении пользователя, и в этом случае она прекрасно работает. Код потребителя:
`
Любая помощь будет очень признательна.
Я перепробовал все