9

APScheduler (v3.0.0) でインターバル ジョブをスケジュールしようとしています。

私はもう試した:

from apscheduler.schedulers.blocking import BlockingScheduler
sched = BlockingScheduler()

def my_interval_job():
    print 'Hello World!'
sched.add_job(my_interval_job, 'interval', seconds=5)
sched.start()

from apscheduler.schedulers.blocking import BlockingScheduler
sched = BlockingScheduler()

@sched.scheduled_job('interval', id='my_job_id', seconds=5)
def my_interval_job():
    print 'Hello World!'
sched.start()

どちらもdocsに従って動作するはずですが、ジョブは起動しません...


更新:
環境に関連して、タスクの実行を妨げている何かがあったことが判明しました。今朝、昨日のコードを変更することなく、タスクは正常に機能しています。


更新 2:
さらにテストした結果、「間隔」ジョブは一般的に不安定なように見えることがわかりました...上記のコードは開発環境で機能するようになりましたが、ステージング環境にデプロイするときは機能しません (私は heroku を使用しています)ステージング用のアプリ)。ステージング/本番環境で問題なく動作する他の apscheduler 'cron' ジョブがあります。

「apscheduler.schedulers」ロガーの DEBUG ロギングをオンにすると、ログにインターバル ジョブが追加されたことが示されます。

ジョブ "my_cron_job1" をジョブ ストア "default" に 追加
ジョブ "my_cron_job2" をジョブ ストア "default" に
追加 ジョブ "my_interval_job" をジョブ ストア "default" に 追加ジョブは暫定的に -- スケジューラーの開始時に適切にスケジュールされ ます 実行するジョブを探します 次のウェイクアップは 2015-03-24 15:05:00-07:00 の予定です ( 254.210542 秒)




インターバル ジョブが 5 秒に設定されている場合、次のウェイクアップの期限が今から 254 秒になるのはどうしてですか??

4

5 に答える 5

5

元の問題の原因はわかりませんでしたが、「間隔」ジョブが「cron」ジョブの前にスケジュールされるように、ジョブがスケジュールされる順序を入れ替えることで回避しました。

つまり、私はこれから切り替えました:

def my_cron_job1():
    print "cron job 1"

def my_cron_job2():
    print "cron job 2"

def my_interval_job():
    print "interval job"

if __name__ == '__main__':
    from apscheduler.schedulers.blocking import BlockingScheduler
    sched = BlockingScheduler(timezone='MST')

    sched.add_job(my_cron_job1, 'cron', id='my_cron_job1', minute=10)
    sched.add_job(my_cron_job2, 'cron', id='my_cron_job2', minute=20)

    sched.add_job(my_interval_job, 'interval', id='my_job_id', seconds=5)

これに:

def my_cron_job1():
    print "cron job 1"

def my_cron_job2():
    print "cron job 2"

def my_interval_job():
    print "interval job"

if __name__ == '__main__':
    from apscheduler.schedulers.blocking import BlockingScheduler
    sched = BlockingScheduler(timezone='MST')

    sched.add_job(my_interval_job, 'interval', id='my_job_id', seconds=5)

    sched.add_job(my_cron_job1, 'cron', id='my_cron_job1', minute=10)
    sched.add_job(my_cron_job2, 'cron', id='my_cron_job2', minute=20)

これで、cron ジョブとインターバル ジョブの両方が両方の環境で問題なく実行されるようになりました。

于 2015-03-24T23:35:48.963 に答える
0

ドキュメントにエラーがありました。私は今それを修正しました。その最初の行は次のようになります。

from apscheduler.schedulers.blocking import BlockingScheduler

ただし、ImportError が発生したはずですが、何も言及していませんでした。提供された例のいずれかを試しましたか?

于 2015-03-24T12:25:00.530 に答える