Telethon Python. Почему client.run_until_disconnected() выполняется бесконечно долго?

Рейтинг: -1Ответов: 1Опубликовано: 10.03.2023
Вот кусок кода, который почему-то зависает на строчке client.run_until_disconnected(). Если вы запустите функцию, то увидите, что print выполнился 1 раз. Почему так происходит?
from telethon import TelegramClient, events
import asyncio
import time

async def f(api_id, api_hash):
    client = TelegramClient("name", api_id, api_hash)
    await client.connect()
    t_start = time.time()
    while True:
        t_all =  time.time() - t_start
        if t_all >= 10:
            client.disconnect()
            break
        @client.on(events.NewMessage)
        async def handler(event):
            print("new message")
        print(1)
        await client.run_until_disconnected()

api_id = 1111111111111
api_hash = "aaaaaaaaaaaaaaaaaaaaaa"
asyncio.run(f(api_id,api_hash))

Ответы

▲ 0

Проблема в том, что каждый раз при вызове функции await client.run_until_disconnected(), создается новый обработчик events.NewMessage. При этом предыдущий обработчик не отменяется и продолжает ожидать события, что приводит к зависанию

Попробуйте так

async def f(api_id, api_hash):
    client = TelegramClient("name", api_id, api_hash)
    await client.connect()
    handler = None  # инициализируем переменную обработчика
    try:
        handler = events.NewMessage()
        @handler.on(events.NewMessage)
        async def on_new_message(event):
            print("new message")
        await client.add_event_handler(handler)  # добавляем обработчик событий клиенту
        t_start = time.time()
        while True:
            t_all = time.time() - t_start
            if t_all >= 10:
                await client.disconnect()
                break
            print(1)
            await asyncio.sleep(1)
    finally:
        if handler is not None:
            await client.remove_event_handler(handler)  # удаляем обработчик событий