2016-09-11 5 views
1

이메일을 보내기위한 cron 작업을 만들기 위해 Heroku에서 APScheduler와 SendGrid를 사용하려고합니다.Heroku에서 APScheduler를 사용하여 cron 작업을 예약하는 방법은 무엇입니까?

add_job 메서드 호출이 올바르게 실행되는 것 같지만 다음 오류가 발생합니다.

다음은 내가 아래 clock.py 파일에 하나 개의 클럭 프로세스를 실행하고 Heroku가

2016-09-11T22:33:37.776867+00:00 heroku[clock.1]: State changed from crashed to starting 
2016-09-11T22:33:40.672563+00:00 heroku[clock.1]: Starting process with command `python clock.py` 
2016-09-11T22:33:41.353373+00:00 heroku[clock.1]: State changed from starting to up 
2016-09-11T22:33:43.527949+00:00 app[clock.1]: created background scheduler 
2016-09-11T22:33:43.528848+00:00 app[clock.1]: started background scheduler 
2016-09-11T22:33:43.572751+00:00 app[clock.1]: added cron job 
2016-09-11T22:33:43.585801+00:00 app[clock.1]: Exception in thread APScheduler (most likely raised during interpreter shutdown): 
2016-09-11T22:33:43.585807+00:00 app[clock.1]: Traceback (most recent call last): 
2016-09-11T22:33:43.585808+00:00 app[clock.1]: File "/app/.heroku/python/lib/python2.7/threading.py", line 801, in __bootstrap_inner 
2016-09-11T22:33:43.585810+00:00 app[clock.1]: File "/app/.heroku/python/lib/python2.7/threading.py", line 754, in run 
2016-09-11T22:33:43.585827+00:00 app[clock.1]: File "/app/.heroku/python/lib/python2.7/site-packages/apscheduler/schedulers/blocking.py", line 29, in _main_loop 
2016-09-11T22:33:43.585829+00:00 app[clock.1]: File "/app/.heroku/python/lib/python2.7/threading.py", line 614, in wait 
2016-09-11T22:33:43.585848+00:00 app[clock.1]: File "/app/.heroku/python/lib/python2.7/threading.py", line 364, in wait 
2016-09-11T22:33:43.585851+00:00 app[clock.1]: <type 'exceptions.ValueError'>: list.remove(x): x not in list 
2016-09-11T22:33:43.695569+00:00 heroku[clock.1]: Process exited with status 0 
2016-09-11T22:33:43.719265+00:00 heroku[clock.1]: State changed from up to crashed 

의 로그입니다.

from apscheduler.schedulers.background import BackgroundScheduler 
import sendgrid 
import os 
from sendgrid.helpers.mail import * 

def send_email(): 
    try: 
    sg = sendgrid.SendGridAPIClient(apikey=os.environ.get('SENDGRID_API_KEY')) 
    print("created send grid api client") 
    from_email = Email("[email protected]") 
    print("created from email") 
    subject = "Weekly update" 
    to_email = Email("[email protected]") 
    print("created to email") 
    content = Content("text/plain", "Hello, Email!") 
    print("created content") 
    mail = Mail(from_email, subject, to_email, content) 
    print("created mail") 
    response = sg.client.mail.send.post(request_body=mail.get()) 
    except Exception as e: 
    return e 

try: 
    sched = BackgroundScheduler() 
    print("created background scheduler") 
    sched.start() 
    print("started background scheduler") 
    sched.add_job(send_email, 'cron', day_of_week=6, hour=22, minute=20) 
    print("added cron job") 
except Exception as e: 
    print e.message 

다음은 내 Procfile입니다.

clock: python clock.py 

여기 내 requirements.txt 파일입니다.

APScheduler==3.1.0 
sendgrid==3.4.0 

내가 뭘 잘못하고 있는지 말해 줄 수 있습니까?

답변

0

백그라운드 스케줄러를 시작했지만 주 스레드가 종료되도록 허용했으나 시계 프로세스도 종료되었습니다. 이것은 BlockingScheduler이 존재하는 모든 이유입니다. Heroku의 APScheduler instructions을 읽지 않으십니까?

+0

해당 지침을 참조 해 주셔서 감사합니다. 처음으로 그 지시 사항을 시험해 보았을 때, 나의 시계 과정은 분명한 이유없이 SIGTERM으로 나가기를 계속했습니다. 나는 이것이 내가 틀린 일을하고 있다는 것을 의미한다고 생각했다. 그래서 나는 스케쥴러의 유형을 바꾸려고 생각했다. 이제 cron 작업을 실행할 시간이 아닐 때 시계 프로세스가 종료된다는 것을 알고 있습니다. –

+0

당신은 그것에 대해 확신합니까? 나는 Heroku를 많이 사용하지 않았지만 적어도 APScheduler가 관련되어 있다면 이상하게 들린다. 프로세스가 자체적으로 종료되지 않아야합니다. –