如何让Telethon客户端在CTRL+C或程序关闭时强制断开连接
解决方案
问题根因
你当前的代码没有处理程序终止信号,按下CTRL+C时会直接中断进程,没有执行Telethon客户端的正常断连逻辑,导致Telegram服务端仍保留旧的会话连接标识,二次启动时会话冲突无法连接。
修改后代码
from telethon import TelegramClient, events import globals, asyncio client = TelegramClient('anon', globals.api_id, globals.api_hash) @client.on(events.NewMessage(chats=globals.tLink)) async def my_event_handler(event): print(event.raw_text) async def main(): try: await client.start() await client.run_until_disconnected() except KeyboardInterrupt: pass finally: # 所有退出场景都会执行断连逻辑,清理服务端会话 await client.disconnect() if __name__ == "__main__": asyncio.run(main())
补充说明
- 代码将原来的同步调用逻辑改为异步显式管理生命周期,
finally块会在程序收到CTRL+C、抛出异常、正常退出等所有场景下执行,保证客户端和Telegram服务端的会话正常断开,不会残留旧连接 - 原代码导入的
sync模块可以移除,异步管理生命周期的方式更稳定,也更容易处理退出逻辑 - 如果需要兼容3.7以下版本Python(无
asyncio.run接口),可以把最后一行替换为:loop = asyncio.get_event_loop() loop.run_until_complete(main())
内容的提问来源于stack exchange,提问作者Eduard Schranzmeister Bäcker
相关产品推荐
相关产品推荐

