Я пытаюсь использовать APScheduler и SendGrid на Heroku, чтобы создать задание cron для отправки электронной почты.Как вы планируете работу cron с помощью APScheduler на Heroku?
Несмотря на то, что вызов метода add_job, кажется, выполняется правильно, я получаю следующую ошибку.
Ниже приведены журналы из 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
Я бегу один процесс синхронизации, который находится в clock.py файле ниже.
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
Это мой файл требований.txt.
APScheduler==3.1.0
sendgrid==3.4.0
Не мог бы кто-нибудь рассказать мне, что я делаю неправильно?
Благодарим вас за обращение к этим инструкциям. Когда я впервые попробовал эти инструкции, мой часовой процесс продолжал выходить с SIGTERM без видимых причин. Я думал, что это означает, что я делал что-то неправильно, поэтому я решил изменить тип планировщика. Теперь я знаю, что процесс синхронизации завершается, когда не наступает выполнение задания cron. –
Вы в этом уверены? Я не очень часто использовал Heroku, но это звучит немного странно, по крайней мере, если задействован APScheduler. Процесс не должен заканчиваться сам по себе. –