假设我有两个cron触发器:
trigger1 = CronTrigger(second='0,20,40')
trigger2 = CronTrigger(second='0,10,20,30,40,50')
并且我这样创建调度程序:
scheduler = BlockingScheduler()
scheduler.add_job(lambda: method1(param1, param2), trigger=trigger1)
scheduler.add_job(lambda: method2(param1, param3), trigger=trigger2)
使用这两种有效的方法:
def method1(s, t):
print("doing work in method1")
time.sleep(2)
print("doing work in method1")
time.sleep(2)
print("doing work in method1")
time.sleep(2)
def method2(s, t):
print("doing work in method2")
time.sleep(2)
print("doing work in method2")
time.sleep(2)
print("doing work in method2")
time.sleep(2)
[当计划的时间重叠时(例如0、20、30),并且计划程序在该时间计划了两个作业,则似乎是并行运行它们。输出看起来像这样:
doing work in method1
doing work in method2
doing work in method1
doing work in method2
doing work in method1
doing work in method2
问题是:如何设置它,以便挂起的作业按顺序运行。即。如果两个作业的时间重叠,请运行第一个作业直到完成,然后再运行第二个作业。
编辑:之所以使用apsschedule库,是因为我需要类似cron的功能。我需要该流程在一天中的特定时间间隔内运行。
我发现您可以结合使用“ apsScheduler”和“ schedule”库来实现此目的,因为调度库按顺序运行挂起的作业。
解决方案是通过使用apsScheduler仅在您希望作业运行的一天中的时间之间调用run_pending方法(从计划库中调用):>
请注意,在apsScheduler未调用run_pending方法时,调度库仍将调度作业运行。这意味着,当您在“停机期”之后第一次调用run_pending方法时,它将在“积压”中运行每个作业一次。这对于我的用例来说是完美的,但可能不适用于其他情况。from apscheduler.schedulers.blocking import BlockingScheduler from apscheduler.triggers.cron import CronTrigger import schedule schedule.every(20).seconds.do(method1, param1, param2) schedule.every(10).seconds.do(method2, param1, param3) trigger1 = CronTrigger(hour="8-20", second="0,20,40") trigger2 = CronTrigger(hour="8-20", second="0,10,20,30,40,50") apsscheduler = BlockingScheduler() apsscheduler.add_job(lambda: schedule.run_pending(), trigger=trigger1) apsscheduler.add_job(lambda: schedule.run_pending(), trigger=trigger2) apsscheduler.start()
Caveat: