如何创建与Telethon事件处理器并行运行的异步函数?
解决方案
你的核心问题是同步阻塞的time.sleep(5)卡住了事件循环,哪怕用asyncio.ensure_future也没法实现真正的非阻塞。要让my_event_handler无需等待check_message_exists执行完毕就继续运行,需要做两处关键修改:
- 把同步的
time.sleep(5)替换为异步的await asyncio.sleep(5),避免阻塞整个事件循环 - 使用Python 3.7+推荐的
asyncio.create_task替代asyncio.ensure_future来创建后台任务
修改后的完整代码:
import logging import asyncio import time logging.basicConfig(format='[%(levelname) 5s/%(asctime)s] %(name)s: %(message)s', level=logging.WARNING) from telethon import TelegramClient, events api_id = '**' api_hash = '**' client = TelegramClient('anon', api_id, api_hash) async def check_message_exists(event): # 替换同步sleep为异步sleep await asyncio.sleep(5) print(event, time.time()) @client.on(events.NewMessage(chats = [-100**])) async def my_event_handler(event): # 使用create_task创建后台任务,无需等待完成 asyncio.create_task(check_message_exists('Got message')) client.start() client.run_until_disconnected()
关键说明
- 异步睡眠的必要性:
time.sleep是同步调用,会占用整个线程直到睡眠结束,导致事件循环无法处理其他任务;而asyncio.sleep是异步的,会在睡眠期间释放事件循环,让其他任务(比如新的消息处理)可以正常运行。 - 后台任务创建:
asyncio.create_task会把异步函数包装成任务并立即调度执行,my_event_handler在调用后会直接继续执行,无需等待任务完成。
内容的提问来源于stack exchange,提问作者m1ck3y
相关产品推荐
相关产品推荐

