【问题标题】:APScheduler - job not executedAPScheduler - 作业未执行
【发布时间】:2015-09-25 14:52:52
【问题描述】:

我是 APScheduler 的新手,并在更大范围内实施之前对其进行了测试。

我创建了下面的代码,但不知何故,当我将 add_job 与 trigger='date' 一起使用时,我的函数永远不会被调用。如果我使用trigger='interval',那么一切正常。

我也尝试过使用run_date 参数,但没有成功。

知道什么地方出了问题吗?

Apscheduler 是 3.0.3 版

提前非常感谢:)

def my_listener(event):
    if event.exception:
        print('The job crashed :(')
    else:
        print('The job worked :)')

def test():
    print("{}  ok ".format(datetime.now()))


def myFunc(content, img):
    print("{} - content={}|image{}".format(datetime.now(), content, img))
    myfile = open("scheduler.log", "a")
    myfile.write("{} - content={}|image{}".format(datetime.now(), content, img))
    myfile.close()

def main():
    jobstores = \
        {
            'default': SQLAlchemyJobStore(url="postgresql+psycopg2://{}:{}@{}:{}/{}".format(db_user, db_password, db_host, db_port, db_database))
        }

    executors = \
        {
            'default': ThreadPoolExecutor(20),
            'processpool': ProcessPoolExecutor(5)
        }

    job_defaults = \
        {
            'coalesce': False,
            'max_instances': 3
        }

    scheduler = BackgroundScheduler(jobstores=jobstores, executors=executors, job_defaults=job_defaults, timezone=utc)
    scheduler.start()
    CURR_DATE = datetime.strptime(datetime.strftime(datetime.now(), '%Y%m%d%H%M'), '%Y%m%d%H%M')
    JOB_DATE = CURR_DATE + timedelta(minutes=1)
    uid=uuid.uuid4()
    newjob = scheduler.add_job(myFunc,
                                trigger='date',
                                args=['content data', 'image data'],
                                kwargs=None,
                                id=str(uid),
                                name='test' + str(uid),
                                misfire_grace_time=5,
                                coalesce=False,
                                max_instances=1,
                                next_run_time= JOB_DATE,
                                jobstore='default',
                                executor='default',
                                replace_existing=True)

    print("Added - {}".format(newjob))
    scheduler.add_listener(my_listener, events.EVENT_JOB_EXECUTED | events.EVENT_JOB_ERROR)
    scheduler.print_jobs()
    while True:
        sys.stdout.write('{}\n'.format(datetime.now())); sys.stdout.flush()
        sleep(1)

if __name__ == "__main__":
    main()

【问题讨论】:

    标签: apscheduler


    【解决方案1】:

    问题是你正在使用 next_run_time=工作日期, 而不是 run_date=JOB_DATE,

    另一种选择是声明您的触发器并将其作为参数传递以添加作业,如下所示:

    trigger = DateTrigger(run_date=start_date)
    newjob = scheduler.add_job(myFunc,
                                trigger=trigger,
                                args=['content data', 'image data'],
                                kwargs=None,
                                id=str(uid),
                                name='test' + str(uid),
                                misfire_grace_time=5,
                                coalesce=False,
                                max_instances=1,
                                jobstore='default',
                                executor='default',
                                replace_existing=True)
    

    您的代码的另一个问题是,当您使调度程序具有时间感知功能时,您正在使用不感知的日期时间

    CURR_DATE = datetime.strptime(datetime.strftime(datetime.now(), '%Y%m%d%H%M'), '%Y%m%d%H%M')
    JOB_DATE = CURR_DATE + timedelta(minutes=1) #this is unaware
    

    尝试以这种方式声明您的日期:

    import pytz
    import datetime
    
    job_date = datetime.datetime.now(pytz.UTC) + datetime.timedelta(minutes=1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-29
      • 1970-01-01
      相关资源
      最近更新 更多