所以,我有一些普通的python代码,可以在正常的python shell中完美地工作:
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='r@example.com'],
recipients=['luke@example.com'],
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='r@example.com'],
recipients=['luke@example.com'],
html="<p>Test</p>")
mailer.send_immediately(message)
第二个例子没有生成电子邮件,它运行得很好,没有抛出任何错误,即使将日志级别设置为DEBUG。
Running celery beat with:
celery beat -A pyramid_celery.celery_app --ini development.ini
使用芹菜网站官方文档中引用的pyramid_芹菜插件。下面可以看到我的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
编辑:如果我启动芹菜(没有beat),它可以完美地工作,例如,如果我启动:
celery worker -A pyramid_celery.celery_app --ini development.ini
所有的任务都执行了(一遍又一遍),但是所有的邮件都发送了,没有任何错误,似乎是引入了beat导致了问题
你确定它不能工作吗?我们配置crontab的方式显示"每天只在4:30运行一次"。所以如果你运行到4:30,我希望它能正常执行。
您能否将schedule
更改为{}
,以使其每分钟运行一次作为基本测试?
我在这里的示例中添加了一个crontab示例:
https://github.com/sontek/pyramid_celery/blob/master/examples/scheduler_example/development.ini L33-L36
如果你能提供更多的代码(也许是一个样本的repo或修改的例子已经在repo),显示它不工作,我可以看看,希望修复这个错误。
所以,在谷歌搜索和令人沮丧的调试之后,我发现了一个旧的github问题。它声称,芹菜任务只有在与worker一起启动时才能工作,而不是与beat一起启动。用户状态
Beat不执行任务,它只是发送消息。您需要一个beat实例和一个worker实例!
用相同的命令启动work和beat实例,如下所示:
celery worker --beat -A pyramid_celery.celery_app --ini development.ini
我今天将发送一个pull请求,以修复有关启动worker和beat实例的正确方法的文档。
默认情况下,芹菜任务在错误输出时静默失败。它很可能会抛出一个你从未见过的异常。
要确定什么会失败,在任务代码中放入pdb (ipdb)断点,在前台启动celery worker并逐行执行代码。