使用Python APS顺序运行待处理任务

问题描述 投票:0回答:1

假设我有两个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的功能。我需要该流程在一天中的特定时间间隔内运行。

python cron scheduling schedule apscheduler
1个回答
0
投票

我发现您可以结合使用“ apsScheduler”和“ schedule”库来实现此目的,因为调度库按顺序运行挂起的作业。

解决方案是通过使用apsScheduler仅在您希望作业运行的一天中的时间之间调用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:

请注意,在apsScheduler未调用run_pending方法时,调度库仍将调度作业运行。这意味着,当您在“停机期”之后第一次调用run_pending方法时,它将在“积压”中运行每个作业一次。这对于我的用例来说是完美的,但可能不适用于其他情况。
© www.soinside.com 2019 - 2024. All rights reserved.