如何在单个Notebook中运行多个调度任务?
解决Notebook中多调度任务不执行的问题
核心问题
你遇到的问题根源在于BlockingScheduler.start()是阻塞式方法——一旦调用,当前线程会被调度器占用,后续代码(包括sched2的初始化和启动)完全不会执行。所以sched2根本没机会启动,自然不会生成file2.csv。
另外你的代码还有个隐性问题:add_job(df.to_csv('file1.csv'), ...)会在添加任务时立即执行一次df.to_csv,而不是等到指定时间再执行。正确做法是传递函数对象(比如用lambda包装),而非函数调用的结果。
最优解决方案:单个调度器管理多个任务
不需要创建多个调度器,一个BlockingScheduler就可以管理任意多个定时任务,这是最简洁高效的方式:
from apscheduler.schedulers.blocking import BlockingScheduler from apscheduler.triggers.cron import CronTrigger # 假设df已经提前定义完成 sched = BlockingScheduler(timezone='US/Central') # 用lambda包装任务函数,避免立即执行 sched.add_job( lambda: df.to_csv('file1.csv'), CronTrigger(hour='12', minute='15'), misfire_grace_time=300, coalesce=True ) sched.add_job( lambda: df.to_csv('file2.csv'), CronTrigger(hour='12', minute='16'), misfire_grace_time=300, coalesce=True ) sched.start()
不推荐:多线程运行多个调度器
如果你确实需要同时运行多个独立调度器(几乎没有必要),可以通过多线程实现,但在Notebook中可能存在稳定性问题:
from apscheduler.schedulers.blocking import BlockingScheduler from apscheduler.triggers.cron import CronTrigger import threading def run_sched1(): sched1 = BlockingScheduler(timezone='US/Central') sched1.add_job(lambda: df.to_csv('file1.csv'), CronTrigger(hour='12', minute='15'), misfire_grace_time=300, coalesce=True) sched1.start() def run_sched2(): sched2 = BlockingScheduler(timezone='US/Central') sched2.add_job(lambda: df.to_csv('file2.csv'), CronTrigger(hour='12', minute='16'), misfire_grace_time=300, coalesce=True) sched2.start() # 启动两个独立线程 thread1 = threading.Thread(target=run_sched1) thread2 = threading.Thread(target=run_sched2) thread1.start() thread2.start()
对你问题的直接回答
不需要为每个终端/Notebook单独配置调度器,单个Notebook中可以运行多个调度器,但强烈不推荐——多调度器会增加资源消耗和复杂度,用同一个调度器管理所有定时任务才是合理选择。
内容的提问来源于stack exchange,提问作者DJC
相关产品推荐
相关产品推荐

