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

使用Python schedule库调度双定时任务无法终止首任务导致次任务不运行问题

问题核心原因

你之前的三个方案都无法终止正在运行的job1,本质是因为schedule库的任务是同步阻塞执行的:一旦job1启动运行,主程序就会进入job1内部的循环逻辑,外层的时间判断、取消任务的代码完全没有执行机会,自然没法在12点强制停掉正在运行的job1。

可行修改方案

1. 给job1添加实时终止判断

在job1的循环逻辑里,每处理一条数据都先检查当前时间是否超过12点,只要超出就立刻跳出循环终止任务。

2. 简化调度逻辑

无需创建多个调度器,使用单个调度器结合时间判断即可满足需求。

完整修改后代码

import time
from datetime import datetime
import datetime as dt
import schedule

def job1():
    liat = get_LI_AT()
    # 任务终止时间:当天12点
    stop_time = dt.time(12, 0)
    for doc in db.collection_linkedin.find():
        # 每次循环先判断是否到终止时间,到了就直接退出任务
        if datetime.now().time() >= stop_time:
            print("job1已到终止时间,停止运行")
            break
        try:
            if main_scrap.calculate_time(doc['Link']) >= 1:
                rslt = main_scrap.update_company(doc['Link'], liat)
                print(rslt)
                time.sleep(1)
        except Exception as e:
            print("check ", doc['Link'])
            pass

def job2():
    liat = get_LI_AT()
    main_scrap.companies_scraping(liat)

# 注册定时任务
schedule.every().day.at('7:30').do(job1)
schedule.every().day.at('14:30').do(job2)

if __name__ == "__main__":
    while True:
        now_time = datetime.now().time()
        # 7-12点运行job1相关调度
        if dt.time(7, 0) < now_time < dt.time(12, 0):
            schedule.run_pending()
            time.sleep(1)
        # 14-18点运行job2相关调度
        elif dt.time(14, 0) < now_time < dt.time(18, 0):
            schedule.run_pending()
            time.sleep(1)
        # 其余时间休眠,减少资源占用
        else:
            time.sleep(60)
补充说明

如果job1单次爬取单个链接的耗时非常长(超过半小时甚至更久),需要更精准的到点终止,可以改用多线程运行job1,到时间点直接终止对应线程即可,普通场景下上述方案已经可以满足需求。

内容的提问来源于stack exchange,提问作者Abir Khaldi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 10:51:11