Telethon Python. Почему client.run_until_disconnected() выполняется бесконечно долго?
Вот кусок кода, который почему-то зависает на строчке 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))
Ответы (1 шт):
Автор решения: Aleksandr Fetisov
→ Ссылка
Проблема в том, что каждый раз при вызове функции 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) # удаляем обработчик событий