2017-11-20 11 views
1

毎分開始するようにジョブをスケジュールしようとしています。 、私は特定のアクションにスケジュールされたジョブを開始したいAPSchedulerジョブがスケジュールどおりに起動していません。

from scheduler import scheduler 

scheduler.start() 

from apscheduler.schedulers.background import BackgroundScheduler 
from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor 


executors = { 
    'default': ThreadPoolExecutor(10), 
    'processpool': ProcessPoolExecutor(5) 
} 
job_defaults = { 
    'coalesce': False, 
    'max_instances': 5 
} 

scheduler = BackgroundScheduler(executors=executors,job_defaults=job_defaults) 

私はこのようなモジュールの__init__.pyのスケジューラを初期化します。 私はscheduler.pyスクリプト内で定義されたスケジューラを持っています

def AddJob(): 
    dbid = repository.database.GetDbid() 
    job_id = 'CollectData_{0}'.format(dbid) 
    scheduler.scheduled_job(func=TestScheduler(), 
          trigger='interval', 
          minutes=1, 
          id=job_id 
          ) 

def TestScheduler(): 
    for i in range(0,29): 
     starttime = time() 
     print "test" 
     sleep(1.0 - ((time() - starttime) % 1.0)) 

まず:私はPythonのコンソールでAddJob()機能を実行していたときに、それはRに開始し、このようなバックグラウンドではないが、コンソールは、TestScheduler関数が30秒後に終了するまでブロックされます。私はそれがバックグラウンドスケジューラであるため、バックグラウンドで実行することを期待していました。
秒:1分の繰り返し間隔を指定しても、ジョブは再び開始されません。

私には何が欠けていますか?

UPDATE

私は別のスレッドに問題のおかげで見つけました。間違った行はこれです:

scheduler.scheduled_job(func=TestScheduler(), 
          trigger='interval', 
          minutes=1, 
          id=job_id 
          ) 

私はそれを変更:

scheduler.add_job(func=TestScheduler, 
          trigger='interval', 
          minutes=1, 
          id=job_id 
          ) 

TestScheduler()TestSchedulerになります。 TestScheduler()を使用すると、関数TestScheduler()の結果がadd_job()の引数として渡されます。

答えて

1

最初の問題は、__init__.pyの内部でスケジューラを初期化しているようですが、これは推奨される方法ではないようです。
__init__.pyに存在するコードは、特定のフォルダのモジュールが初めてインポートされるときに実行されます。例えば、このような構造を想像:__init__.py

my_module 
|--__init__.py 
|--test.py 

を:

from scheduler import scheduler 

scheduler.start() 

scheduler.start()コマンドがときfrom my_module import something実行されます。ですから、それは__init__.pyから始まっていないか、何度も始まります(コードの残りの部分に依存します)。

もう1つの問題はscheduler.scheduled_job()メソッドの使用である必要があります。ドキュメントon adding jobsを読んだ場合は、便宜のためにデコレータであるscheduled_job()ではなく、add_job()メソッドを使用することをお勧めします。

私はこのような何かを示唆している:あるとして

  1. my_scheduler.pyしてください。
  2. scheduler.start()の行を__init__.pyから削除します。次のよう
  3. はあなたのメインのファイルを変更し

    from my_scheduler import scheduler 
    
    if not scheduler.running: # Clause suggested by @CyrilleMODIANO 
        scheduler.start() 
    
    def AddJob(): 
        dbid = repository.database.GetDbid() 
        job_id = 'CollectData_{0}'.format(dbid) 
        scheduler.add_job(
         func=TestScheduler, 
         trigger='interval', 
         minutes=1, 
         id=job_id 
        ) 
    
    ... 
    
+0

は、私のポストへの解決策を追加しましたあなたの推奨されているように私のinit.pyから)(scheduler.startを削除しました。 scheduler.start() –

+0

グッド おかげで、あなたが好きなら、あなたがこの回答を受け入れることができ@CyrilleMODIANOを知っている:) –

+0

を:scheduler.runningない場合 を: はまた、それが既に実行されている場合、スケジューラの再起動を回避するために句を追加しましたあなたがあなたの答えを訂正すれば、私は@JohnMoutafis –

関連する問題