从cron表达式创建apscheduler作业触发器

2024-05-28 20:54:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在python中使用cron表达式运行一些调度的作业。我是python新手,我已经在java中使用quartz调度器来实现几乎相同的功能。现在,我正在尝试使用python中的apscheduler。我知道可以用

crontrig = CronTrigger(minute='*', second = '*');

但是,我使用的是cron表达式(比如“0/5*****”),我想知道是否有任何东西可以直接解析表达式并生成CronTrigger。在


Tags: 功能表达式作业java调度cronsecondquartz
3条回答

正如@Alex提到的。我创建了一个函数来映射要触发的值。在

下面的函数将按顺序返回一个元组 年,月,日,周,周,小时,分钟,秒。期待一些建议。在

def evaluate(self, expression):
    '''
    order of values
    year, month, day, week, day_of_week, hour, minute, second, start_date, end_date, timezone
    '''
    splitValues = expression.split();
    for i in range(0,8):
        if (i == 0):
            if (splitValues[0] == '?'):
                year = None;
            else:
              year = splitValues[0];
        if (i == 1):
            if (splitValues[1] == '?'):
                month = None;
            else:
                month = splitValues[1];
        if (i == 2):
            if (splitValues[2] == '?'):
                day = None;
            else:
                day = splitValues[2];
        if (i == 3):
            if (splitValues[3] == '?'):
                week = None;
            else:
              week = splitValues[3];
        if (i == 4):
            if (splitValues[4] == '?'):
                day_of_week = None;
            else:
                day_of_week = splitValues[4];
        if (i == 5):
            if (splitValues[5] == '?'):
                hour = None;
            else:
                hour = splitValues[5];
        if (i == 6):
            if (splitValues[6] == '?'):
                minute = None;
            else:
                minute = splitValues[6];
        if (i == 7):
            if (splitValues[7] == '?'):
                second = None;
            else:
                second = splitValues[7];
    return year, month, day, week, day_of_week, hour, minute, second;

我用这个表达式创建了一个createTrigger函数

^{pr2}$

考虑到APScheduler支持一组稍微不同的字段,那么这些表达式如何映射到CronTrigger的参数就不那么明显了。在

我还应该指出,调度作业的首选方法不涉及直接实例化触发器,而是提供参数add\ujob()。在

如果您想自己这样做,您可以简单地拆分表达式并将元素映射到您想要的任何触发器参数。在

在raghu Venmarathor代码下做了一些小改动

def get_trigger(expression):
    # type: (str) -> CronTrigger
    """
    Evaluates a CronTrigger obj from cron expression
    :param expression: String representing the crons five first fields, e.g : '* * * * *'
    :return: A CronTrigger
    """
    vals = expression.split()
    vals = [(None if w == '?' else w) for w in vals]
    return CronTrigger(minute=vals[0], hour=vals[1], day=vals[2], month=vals[3], day_of_week=vals[4])

更新

在版本3.5.0中,添加了以下方法:

^{pr2}$

相关问题 更多 >

    热门问题