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

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调度器(生产环境更稳定)

不用自己维护循环逻辑,直接用专业的定时任务调度库实现,自带启停、任务管理能力:

  1. 先安装依赖:pip install apscheduler
  2. 代码实现:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:06:03