48

フラスコ アプリケーションで apscheduler を使用しているときに問題が発生しました。

私のview.pyファイルでは、私はこのように書いています

import time
from apscheduler.scheduler import Scheduler

def test_scheduler():
     print "TEST"
     print time.time()


sched = Scheduler()
sched.add_interval_job(test_scheduler, seconds=5)
sched.start()

そして、このメソッド test_scheduler() は 5 秒ごとに 2 回実行されます

テスト 1360844314.01 テスト 1360844314.2

4

5 に答える 5

68

デバッグモードでは、Flaskのリローダーがフラスコアプリを2回ロードします(デバッグモードでFlaskが2回初期化されるのを停止するにはどうすればよいですか?)。これがなぜなのかはわかりませんが、apschedulerのジョブが2回スケジュールされる原因になります。直前print "loaded scheduler"にこれをsched.start()確認します。

リンクされた回答で述べられているように、これを回避する方法はいくつかあります。私が最もうまくいったのは、次のようにリローダーを無効にすることです。

app.run(use_reloader=False)

これは、開発時にアプリを手動でリロードする必要があることを意味しますが、apschedulerを機能させるために支払うのは少額です。

于 2013-03-19T04:38:34.233 に答える
14

Flask のbefore_first_request()デコレーターでスケジューラーを開始できます。このスケジューラーは、「アプリケーションのこのインスタンスへの最初のリクエストの前に実行する関数を登録します」。

import time
import atexit

from apscheduler.schedulers.background import BackgroundScheduler


def print_date_time():
    print(time.strftime("%A, %d. %B %Y %I:%M:%S %p"))


@app.before_first_request
def init_scheduler():
    scheduler = BackgroundScheduler()
    scheduler.add_job(func=print_date_time, trigger="interval", seconds=3)
    scheduler.start()
    # Shut down the scheduler when exiting the app
    atexit.register(lambda: scheduler.shutdown())

before_first_request()サーバーのリロード後、最初のリクエストで常に再度呼び出されることに注意してください。

于 2016-07-21T10:11:07.400 に答える
-2

最良の解決策は、add_cron_job('*')代わりに使用することですadd_interval_job('*')

于 2013-02-14T13:37:47.040 に答える
-3

私はそれを作りました、私は特定の時点の後に開始するために add_interval_job パラメータを追加しました

sched.add_interval_job(test_scheduler, seconds=5, start_date='2013-02-13 00:00')
于 2013-02-14T13:16:44.920 に答える