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

