Celery计划任务中的打印语句没有出现在终端中

问题描述 投票:0回答:6

当我运行

celery -A tasks2.celery worker -B
时,我想看到每秒打印“芹菜任务”。目前没有打印任何内容。为什么这不起作用?

from app import app
from celery import Celery
from datetime import timedelta

celery = Celery(app.name, broker='amqp://guest:@localhost/', backend='amqp://guest:@localhost/')
celery.conf.update(CELERY_TASK_RESULT_EXPIRES=3600,)

@celery.task
def add(x, y):
    print "celery task"
    return x + y

CELERYBEAT_SCHEDULE = {
    'add-every-30-seconds': {
        'task': 'tasks2.add',
        'schedule': timedelta(seconds=1),
        'args': (16, 16)
    },
}

这是盯着工人并殴打后的唯一输出:

[tasks]
  . tasks2.add

[INFO/Beat] beat: Starting...
[INFO/MainProcess] Connected to amqp://guest:**@127.0.0.1:5672//
[INFO/MainProcess] mingle: searching for neighbors
[INFO/MainProcess] mingle: all alone
python celery
6个回答
18
投票

您编写了时间表,但没有将其添加到 celery 配置中。因此,beat 没有看到要发送的计划任务。下面的示例使用

celery.config_from_object(__name__)
从当前模块获取配置值,但您也可以使用任何其他配置方法。

正确配置后,您将看到来自beat的有关发送计划任务的消息,以及工作人员接收和运行这些任务时的输出。

from celery import Celery
from datetime import timedelta

celery = Celery(__name__)
celery.config_from_object(__name__)

@celery.task
def say_hello():
    print('Hello, World!')

CELERYBEAT_SCHEDULE = {
    'every-second': {
        'task': 'example.say_hello',
        'schedule': timedelta(seconds=5),
    },
}
$ celery -A example.celery worker -B -l info

[tasks]
  . example.say_hello

[2015-07-15 08:23:54,350: INFO/Beat] beat: Starting...
[2015-07-15 08:23:54,366: INFO/MainProcess] Connected to amqp://guest:**@127.0.0.1:5672//
[2015-07-15 08:23:54,377: INFO/MainProcess] mingle: searching for neighbors
[2015-07-15 08:23:55,385: INFO/MainProcess] mingle: all alone
[2015-07-15 08:23:55,411: WARNING/MainProcess] celery@netsec-ast-15 ready.
[2015-07-15 08:23:59,471: INFO/Beat] Scheduler: Sending due task every-second (example.say_hello)
[2015-07-15 08:23:59,481: INFO/MainProcess] Received task: example.say_hello[2a9d31cb-fe11-47c8-9aa2-51690d47c007]
[2015-07-15 08:23:59,483: WARNING/Worker-3] Hello, World!
[2015-07-15 08:23:59,484: INFO/MainProcess] Task example.say_hello[2a9d31cb-fe11-47c8-9aa2-51690d47c007] succeeded in 0.0012782540870830417s: None

14
投票

在 4.1.0 版本中,您必须将

logger
添加到您的
task.py
文件中,如下所示:

from celery.utils.log import get_task_logger

logger = get_task_logger(__name__)


@task(name="multiply_two_numbers")
def mul(x, y):
    total = x * (y * random.randint(3, 100))
    #HERE:
    logger.info('Adding {0} + {1}'.format(x, y))
    return total

如果您想了解更多信息,请在此处的文档中说明: http://docs.celeryproject.org/en/latest/userguide/tasks.html


6
投票

实际上,我在命令提示符下打印我的内容时遇到了问题,因为我使用了错误的命令,但我发现了一个指向我分叉的项目的链接Project

  • (如果在 Mac 上)
    celery -A Project worker --loglevel=info
  • (如果在 Windows 上)
    celery -A Project worker -l info --pool=solo

1
投票

确保为计划任务运行 celery Beat Worker:

celery beat --app app.celery

在此处查看文档:http://celery.readthedocs.org/en/latest/userguide/periodic-tasks.html#starting-the-scheduler


0
投票

我知道这是一个旧线程,但对于那些遇到它的人......请检查您的应用程序配置。确保“测试”设置为“假”。就我而言,它是一个 Flask 应用程序,我也在使用 Flask 应用程序配置更新 celery 配置

celery.conf.update(app.config)

但只需确保 TESTING 未设置为“True”,


0
投票

我在 Google 网上论坛的此评论中找到了答案:

Celerybeat 不执行任务,它只是发送消息 所以日志消息应该由工作人员生成 不是 celerybeat。

所有

print
logging
都完美地显示在Celeryworker的控制台中。

© www.soinside.com 2019 - 2024. All rights reserved.