2017-11-20 26 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)) 

첫째 : 내가 파이썬 콘솔에서 AddJob() 기능을 실행하고있을 때 그것은 R로 시작 예상대로 작동하지만 백그라운드에서는 작동하지 않으면 콘솔은 30 초 후에 TestScheduler 기능이 종료 될 때까지 차단됩니다. 백그라운드 스케줄러이기 때문에 백그라운드에서 실행되기를 기대하고있었습니다.
둘째 : 반복 간격을 1 분으로 지정해도 작업이 다시 시작되지 않습니다.

무엇이 누락 되었습니까?

UPDATE

나는 다른 스레드에 문제 덕분에 발견했다. 잘못된 줄은 이것이다 :

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

TestScheduler()가된다 TestScheduler :

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

나는 그것을 변경했습니다. TestScheduler()를 사용하면 TestScheduler() 함수의 결과가 add_job()의 인수로 전달됩니다.

답변

1

첫 번째 문제는 권장 방법으로 보이지 않는 __init__.py 내부의 스케줄러를 초기화하는 것 같습니다.
__init__.py에있는 코드는 특정 폴더의 모듈을 처음 가져올 때 실행됩니다.

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

__init__.py과 :

from scheduler import scheduler 

scheduler.start() 

scheduler.start() 명령이 때 from my_module import something 실행됩니다 예를 들어,이 구조를 상상한다. 따라서 어느 것이 든 __init__.py에서 시작하지 않거나 여러 번 시작합니다 (나머지 코드에 따라 다름).

또 다른 문제는 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.running하지 않을 경우 : scheduler.start() 감사를 –

+0

좋은 당신이 대답 : –

+0

을 받아 들일 수 좋아한다면 @CyrilleMODIANO을 알고 당신이 당신의 답을 정정한다면 나는 @JohnMoutafis –