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

如何使用Python Pyrogram同时实现事件监听器与无限循环

解决方案

你的问题核心在于bot.run()是阻塞式调用——它会占据主线程持续运行,导致后面的无限循环代码完全没有执行机会。要同时实现Telegram消息监听和循环任务,这里提供两种实用方案:

方案1:多线程实现(简单直观)

把无限循环逻辑放到单独的线程中,在启动Telegram客户端前先启动这个线程:

from pyrogram import Client, filters
import threading
import time

# 替换为你的实际配置
TELEGRAM_BOT_NAME = "your_bot_name"
TELEGRAM_API_ID = 12345
TELEGRAM_API_HASH = "your_api_hash"

def loop_task():
    """自定义无限循环任务逻辑"""
    while True:
        # 这里写你的循环执行代码
        print("执行循环任务...")
        time.sleep(3)  # 按需调整任务间隔,避免CPU占用过高

bot = Client(TELEGRAM_BOT_NAME, api_id=TELEGRAM_API_ID, api_hash=TELEGRAM_API_HASH)

@bot.on_message(filters.channel)
def my_handler(client, message):
    # 处理频道消息的逻辑
    print(f"收到频道消息:{message.text}")

# 启动循环任务线程,daemon=True表示主线程退出时自动终止子线程
threading.Thread(target=loop_task, daemon=True).start()

# 启动Telegram客户端(阻塞主线程)
bot.run()

方案2:AsyncIO协程(适配Pyrogram异步特性)

Pyrogram本身基于AsyncIO开发,用协程实现任务并行更契合框架设计:

from pyrogram import Client, filters
import asyncio

# 替换为你的实际配置
TELEGRAM_BOT_NAME = "your_bot_name"
TELEGRAM_API_ID = 12345
TELEGRAM_API_HASH = "your_api_hash"

async def loop_task():
    """异步版循环任务"""
    while True:
        # 这里写你的循环执行代码
        print("执行异步循环任务...")
        await asyncio.sleep(3)

async def main():
    async with Client(TELEGRAM_BOT_NAME, api_id=TELEGRAM_API_ID, api_hash=TELEGRAM_API_HASH) as bot:
        # 将循环任务加入事件循环
        asyncio.create_task(loop_task())
        # 保持客户端运行并监听消息
        await bot.idle()

# 启动主协程
asyncio.run(main())

关键注意点

  • 如果循环任务和消息处理需要共享数据,必须保证线程/协程安全:线程方案用threading.Lock,协程方案用asyncio.Lock保护共享变量。
  • 无论哪种方案,都不要写无间隔的死循环,必须添加休眠逻辑控制执行频率,避免占用过多系统资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 16:55:03