如何使用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
相关产品推荐
相关产品推荐

