web-dev-qa-db-ja.com

APSchedulerでインターバルジョブをスケジュールするにはどうすればよいですか?

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 に従って動作するはずですが、ジョブは起動しません...


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


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

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

ジョブ「my_cron_job1」をジョブストア「default」に追加しました
ジョブ「my_cron_job2」をジョブストア「default」に追加しました
ジョブ「my_interval_job」をジョブストア「default」に追加しました
スケジューラーが開始しました
ジョブを暫定的に追加します-スケジューラーの開始時に適切にスケジュールされます
ジョブを暫定的に追加します-スケジューラーの開始時に適切にスケジュールされます
実行するジョブを探しています
次のウェイクアップの期限は2015-03-2415:05:00-07:00(254.210542秒

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

5
Troy

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

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

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ジョブとintervalジョブの両方が両方の環境で問題なく実行されます。

3
Troy

スレッドを存続させる必要があります。これが私がそれをどのように使用したかの例です。

from subprocess import call

import time
import os

from apscheduler.schedulers.background import BackgroundScheduler


def job():
    print("In job")
    call(['python', 'scheduler/main.py'])


if __name__ == '__main__':
    scheduler = BackgroundScheduler()
    scheduler.configure(timezone=utc)
    scheduler.add_job(job, 'interval', seconds=10)
    scheduler.add
    scheduler.start()
    print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C'))

    try:
        # This is here to simulate application activity (which keeps the main thread alive).
        while True:
            time.sleep(5)
    except (KeyboardInterrupt, SystemExit):
        # Not strictly necessary if daemonic mode is enabled but should be done if possible
        scheduler.shutdown()
2
Riaan Steyn

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

簡単です。ほとんどのジョブが時間間隔内に完了しなかったため、保留中の実行が多数あります。

これを整理するために、次のパラメータを使用できます。

 **misfire_grace_time**:    Maximum time in seconds for the job execution to be allowed to delay before it is considered a misfire 
 **coalesce**:  Roll several pending executions of jobs into one

詳細については、ドキュメントを確認してください ここ

0
Amirkhm

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

from apscheduler.schedulers.blocking import BlockingScheduler

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

0
Alex Grönholm

わかりました、更新された質問を見ました。

問題が発生している理由は、間違ったタイムゾーンを使用している可能性があるためです。あなたの国は現在、ほとんどの場所で夏時間を使用しているため、正しいタイムゾーンはおそらくMDT(Mountain Daylight Time)です。しかし、標準時間に戻ると、それは再び壊れます。したがって、「アメリカ/デンバー」のようなタイムゾーンを使用することをお勧めします。これでDSTスイッチが処理されます。

質問:CentOSを使用していますか?これまでのところ、ローカルタイムゾーンの自動検出が不可能な唯一の既知のオペレーティングシステムです。

0
Alex Grönholm