You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建与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()

关键说明

  1. 异步睡眠的必要性:time.sleep是同步调用,会占用整个线程直到睡眠结束,导致事件循环无法处理其他任务;而asyncio.sleep是异步的,会在睡眠期间释放事件循环,让其他任务(比如新的消息处理)可以正常运行。
  2. 后台任务创建:asyncio.create_task会把异步函数包装成任务并立即调度执行,my_event_handler在调用后会直接继续执行,无需等待任务完成。

内容的提问来源于stack exchange,提问作者m1ck3y

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 15:25:19