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

如何在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_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 12:14:59