如何在Pyrogram中结合装饰器使用asyncio.run?
解决Pyrogram中asyncio.run与装饰器配合的问题
先明确你代码里的核心问题:
- 普通的
sleep(10)会直接阻塞整个异步事件循环,导致Pyrogram的消息处理逻辑完全无法执行,必须替换为异步的asyncio.sleep() - Pyrogram的
app.run()本身已封装事件循环管理,但如果要同时运行自定义异步任务,需要在同一事件循环中并发执行,而非用多线程/多进程绕路
正确实现方式
把Pyrogram客户端的启停逻辑和你的自定义循环任务放在同一个异步函数中,用asyncio.gather()实现并发运行:
import asyncio from pyrogram import Client, filters app = Client("my_account") @app.on_message(filters.all) async def reply_on_message(client, message): print("Decorator is working") async def main(): await app.start() try: # 自定义循环任务 while True: print("执行自定义逻辑...") await asyncio.sleep(10) # 必须用异步sleep finally: await app.stop() if __name__ == '__main__': asyncio.run(main())
为什么多线程/多进程没用?
Pyrogram是基于asyncio的异步框架,多线程中直接运行异步代码容易出现事件循环冲突;多进程会导致客户端重复初始化,且进程间通信完全没必要——异步框架本身就支持在同一事件循环中并发执行多个任务,不需要额外用多线程/多进程。
替代方案:用Pyrogram内置任务调度
如果只是需要定时执行任务,也可以用asyncio.create_task()启动循环任务,再让Pyrogram保持运行:
import asyncio from pyrogram import Client, filters app = Client("my_account") @app.on_message(filters.all) async def reply_on_message(client, message): print("Decorator is working") async def my_loop(): while True: print("执行自定义逻辑...") await asyncio.sleep(10) async def main(): asyncio.create_task(my_loop()) await app.run() # 阻塞直到客户端停止 if __name__ == '__main__': asyncio.run(main())
内容的提问来源于stack exchange,提问作者udejo_
相关产品推荐
相关产品推荐

