Python Telegram Bot开发中如何终止正在运行的Selenium定时任务函数
停止Telegram机器人定时循环函数的实现方案
你当前的写法直接在消息处理函数中执行无限while循环,会阻塞机器人主进程,导致后续的停止命令无法被响应,需要先解决阻塞问题,再通过状态标志或调度工具实现启停控制。
方案1:全局运行标志+独立线程(快速实现)
通过全局变量控制循环运行状态,把定时逻辑放到单独线程执行,避免阻塞主进程:
import threading import time import pycron # 定义全局运行状态标志和线程对象 is_absen_running = False absen_thread = None def mulai(update, context): global is_absen_running, absen_thread if is_absen_running: update.message.reply_text('任务已在运行中') return is_absen_running = True update.message.reply_text('Absen Start!') # 把循环逻辑放到独立线程运行 def run_absen_loop(): while is_absen_running: if pycron.is_now('*/1 * * * *'): absen() # 拆分sleep为1秒1次,收到停止信号可以立刻响应,不用等满60秒 for _ in range(60): if not is_absen_running: break time.sleep(1) absen_thread = threading.Thread(target=run_absen_loop) absen_thread.start() # 新增停止命令对应的处理函数 def stop(update, context): global is_absen_running if not is_absen_running: update.message.reply_text('当前没有运行中的任务') return is_absen_running = False update.message.reply_text('Absen 已停止')
之后把stop函数绑定到对应的Telegram命令(比如/stop)即可实现停止功能。
方案2:APScheduler调度器(生产环境更稳定)
不用自己维护循环逻辑,直接用专业的定时任务调度库实现,自带启停、任务管理能力:
- 先安装依赖:
pip install apscheduler - 代码实现:
from apscheduler.schedulers.background import BackgroundScheduler # 初始化调度器并启动 scheduler = BackgroundScheduler() scheduler.start() def mulai(update, context): # 检查是否已有同名任务在运行 if scheduler.get_job('absen_cron_job'): update.message.reply_text('任务已在运行中') return # 添加每1分钟执行一次的定时任务 scheduler.add_job( absen, 'cron', minute='*/1', id='absen_cron_job' ) update.message.reply_text('Absen Start!') def stop(update, context): job = scheduler.get_job('absen_cron_job') if not job: update.message.reply_text('当前没有运行中的任务') return # 移除任务即可停止 job.remove() update.message.reply_text('Absen 已停止')
内容的提问来源于stack exchange,提问作者Pas Connu
相关产品推荐
相关产品推荐

