Celery Beat - почтовая пирамида

Итак, у меня есть простой код Python, который отлично работает в обычной оболочке Python:

from pyramid_mailer.mailer import Mailer
from pyramid_mailer.message import Message
from pyramid_mailer.message import Attachment

mailer = Mailer(
    host="172.10.10.240",
    port="25")
message = Message(
subject="Orders with invalid status",
sender='[email protected]'],
recipients=['[email protected]'],
html="<p>Test</p>")
mailer.send_immediately(message)

Но если я создам задачу с сельдереем, например:

from pyramid_celery import celery_app as app
from pyramid_mailer.mailer import Mailer
from pyramid_mailer.message import Message
from pyramid_mailer.message import Attachment

mailer = Mailer(
    host="172.10.10.240",
    port="25")

@app.task
def wronglines_celery():
    message = Message(
    subject="Orders with invalid status",
    sender='[email protected]'],
    recipients=['[email protected]'],
    html="<p>Test</p>")
    mailer.send_immediately(message)

Этот второй пример не генерирует электронное письмо, он работает отлично и вообще не выдает ошибок, даже если уровень журнала установлен на DEBUG.

Бегущий сельдерей бьет с:

celery beat -A pyramid_celery.celery_app --ini development.ini

Использование подключаемого модуля пирамиды_сельдерея, как указано в официальной документации на веб-сайте сельдерея. Мой файл development.ini можно увидеть ниже (соответствующие части):

[celery]
BROKER_URL = amqp://app_rmq:password@localhost:5672/myvhost
CELERY_IMPORTS = intranet.celery_tasks

# Check once a day for orders with wrong line status
[celerybeat:task1]
task = intranet.celery_tasks.wronglines_celery
type = crontab
schedule = {"hour": 16, "minute": 30}

[logger_celery]
level = DEBUG
handlers =
qualname = celery


# Begin logging configuration
[loggers]
keys = root, intranet, sqlalchemy, celery

РЕДАКТИРОВАТЬ:

Если я запускаю сельдерей (без ритма), он работает отлично, например. если я запускаю с:

celery worker -A pyramid_celery.celery_app --ini development.ini

Все задачи выполняются (снова и снова), но все электронные письма отправляются, и ничто не выдает ошибку, похоже, это связано с появлением ритма, который вызывает проблемы.


person crooksey    schedule 22.07.2015    source источник
comment
Добавьте точку останова отладчика внутри функции и пошагово выполните ее. В противном случае все, что делается здесь, является догадками, и никакого прогресса в этом вопросе добиться невозможно. pythonconquerstheuniverse.wordpress.com/2009/09/10/   -  person Mikko Ohtamaa    schedule 23.07.2015


Ответы (3)


Вы уверены, что он не работает? То, как мы настроили ваш crontab, говорит: «Запускать только один раз в день в 4:30». Поэтому, если вы запустите это, пока оно не достигнет 4:30, я ожидаю, что оно будет выполнено правильно.

Можете ли вы вместо этого изменить schedule на {}, чтобы он запускался каждую минуту в качестве базового теста?

Я добавил пример crontab к примерам здесь:

https://github.com/sontek/pyramid_celery/blob/master/examples/scheduler_example/development.ini#L33-L36

Если вы можете предоставить больше кода (возможно, образец репозитория или модификацию примеров, уже находящихся в репо), который показывает, что он не работает, я могу взглянуть и, надеюсь, исправить ошибку.

person sontek    schedule 23.07.2015
comment
Да, я изменил это для тестирования, см. мой ответ о документации по запуску beat with worker. - person crooksey; 24.07.2015

Итак, после долгих поисков и утомительной отладки я обнаружил старую проблему с github. Это утверждало, что задачи сельдерея работали только при запуске с рабочим, а не с beat. Пользователь заявляет

Beat не выполняет задачи, он просто отправляет сообщения. Вам нужен как битовый экземпляр, так и рабочий экземпляр!

Таким образом, чтобы запустить работу и экземпляр бита с помощью одной и той же команды, показанной здесь:

celery worker --beat -A pyramid_celery.celery_app --ini development.ini

Сегодня я отправлю запрос на извлечение, чтобы исправить документацию в отношении правильного способа запуска рабочего и битового экземпляра.

person crooksey    schedule 24.07.2015

По умолчанию задачи Celery автоматически завершаются с ошибкой. Скорее всего, он выдает исключение, которого вы никогда не видели.

Чтобы быть уверенным, что произойдет сбой, поставьте точку останова pdb (ipdb) в коде задачи, запустите celery worker на переднем плане и выполняйте код построчно.

person Mikko Ohtamaa    schedule 23.07.2015
comment
Спасибо, я уверен, что это должно происходить тихо, поэтому я скопировал всю свою задачу приложения в свой собственный файл Python, использовал тот же импорт, что и мой файл задачи celery, и при запуске через автономный Python, без ошибок, работает отлично. Однако, когда я запускаю сельдерей, он вообще не выдает ошибок, даже с конфигурацией моего файла журнала, как вы предложили. - person crooksey; 23.07.2015
comment
Кроме того, если я запускаю сельдерей с помощью celery worker -A пирамида_celery.celery_app --ini development.ini, код работает нормально, кажется, что проблемы возникают из-за удара сельдерея. - person crooksey; 23.07.2015
comment
from celery.contrib import rdb rdb.set_trace() Затем вы можете подключиться к отладчику через telnet в реальном рабочем процессе. - person Aaron McMillin; 23.07.2015