Закрыть сокет, заблокированный потребителем

У меня есть открытый сокет в бесконечном цикле, прослушивающий XMPP-сервер для получения информации о присутствии пользователей. При получении новой информации она отправляется потребителю для обновления списка пользователей в режиме реального времени. Вот код для моего сокета:

# get consumer channel layer
channel_layer = get_channel_layer()

# define socket
s: socket.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock: ssl.SSLSocket = ssl.wrap_socket(s, cert_reqs=ssl.CERT_NONE, ssl_version=ssl.PROTOCOL_TLSv1_2)

# connect to XMPP Server
sock.connect((hostname, port))

# send request
sock.sendall("<presence/>".encode())
while True:
   # receive presence
   presence = sock.recv(4096)
   
   async_to_sync(channel_layer.group_send)("presence_channel", {"type": "presence", "text": presence})

sock.close()

А это код моего потребителя:

class PresenceConsumer(AsyncJsonWebsocketConsumer):
    async def connect(self):
        self.name = "presence_channel"

        # join channel
        await self.channel_layer.group_add(self.name, self.channel_name)

        await self.accept()

    async def disconnect(self, close_code):
        # leave channel
        await self.channel_layer.group_discard(self.name, self.channel_name)

    # receive message from channel
    async def presence(self, event):
        # Send message to WebSocket
        await self.send_json(event)

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

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