python-3.x - Celery beat 未显示或执行计划任务

标签 python-3.x celery celerybeat

我正在使用 celery 和 celery beat 来处理 Python 项目中的任务执行和计划任务。 我没有使用 django .

执行 celery 任务按预期工作 .但是,我遇到了试图让计划任务( celery 节拍)运行的墙。

我已关注 celery documentation将我的任务成功添加到 app.conf.beat_schedule。如果我在添加任务后打印出节拍时间表,我可以看到该任务已成功添加到app.conf.beat_schedule。

from celery import Celery
from celery.task import task
# Celery init
app = Celery('tasks', broker='pyamqp://guest@localhost//')

# get the latest device reading from the appropriate provider
@app.task(bind=True, retry_backoff=True)
def get_reading(self, provider, path, device, config, location, callback):
    logger.info("get_reading() called")
    module = importlib.import_module('modules.%s' % provider)
    try:
        module.get_reading(path, device, config, location, callback)
    except Exception as e:
        self.retry(exc=e)

# add the periodic task
def add_get_reading_periodic_task(provider, path, device, config, location, callback, interval = 600.0):
    app.conf.beat_schedule = {
        "poll-provider": {
        "task": "get_reading",
        "schedule": interval,
        "args": (provider, path, device, config, location, callback)
        }
    }

    logger.info(app.conf.beat_schedule)
    logger.info("Added task 'poll-provider' for %s to beat schedule" % provider)


查看我的应用程序日志,我可以看到 app.conf.beat_schedule 已更新为传递给 add_get_reading_periodic_task() 的数据:
2017-08-17 11:07:13,216 - gateway - INFO - {'poll-provider': {'task': 'get_reading', 'schedule': 10, 'args': ('provider1', '/opt/provider1', None, {'location': {'lan.local': {'uri': 'http://192.168.1.10'}}}, 'lan.local', {'url': 'http://localhost:8080', 'token': '*******'})}}
2017-08-17 11:07:13,216 - gateway - INFO - Added task 'poll-provider' for provider1 to beat schedule

我在同一个应用程序文件上同时手动运行 celery worker 和 celery beat(在不同的终端窗口中):
$ celery worker -A gateway --loglevel=INFO
$ celery beat -A gateway --loglevel=DEBUG

如果我在我的应用程序中调用 get_reading.delay(...) ,它会按预期由 celery worker 执行。

但是,celery beat 进程永远不会显示任何已注册计划任务的迹象:

celery beat v4.0.2 (latentcall) is starting.
__    -    ... __   -        _
LocalTime -> 2017-08-17 11:05:15
Configuration ->
    . broker -> amqp://guest:**@localhost:5672//
    . loader -> celery.loaders.app.AppLoader
    . scheduler -> celery.beat.PersistentScheduler
    . db -> celerybeat-schedule
    . logfile -> [stderr]@%DEBUG
    . maxinterval -> 5.00 minutes (300s)
[2017-08-17 11:05:15,228: DEBUG/MainProcess] Setting default socket timeout to 30
[2017-08-17 11:05:15,228: INFO/MainProcess] beat: Starting...
[2017-08-17 11:05:15,248: DEBUG/MainProcess] Current schedule:
<ScheduleEntry: celery.backend_cleanup celery.backend_cleanup() <crontab: 0 4 * * * (m/h/d/dM/MY)>
[2017-08-17 11:05:15,248: DEBUG/MainProcess] beat: Ticking with max interval->5.00 minutes
[2017-08-17 11:05:15,250: DEBUG/MainProcess] beat: Waking up in 5.00 minutes.
[2017-08-17 11:10:15,351: DEBUG/MainProcess] beat: Synchronizing schedule...
[2017-08-17 11:10:15,355: DEBUG/MainProcess] beat: Waking up in 5.00 minutes.
[2017-08-17 11:15:15,400: DEBUG/MainProcess] beat: Synchronizing schedule...
[2017-08-17 11:15:15,402: DEBUG/MainProcess] beat: Waking up in 5.00 minutes.
[2017-08-17 11:20:15,502: DEBUG/MainProcess] beat: Synchronizing schedule...
[2017-08-17 11:20:15,504: DEBUG/MainProcess] beat: Waking up in 5.00 minutes.


这似乎通过运行 celery 检查计划得到证实:
-> celery@localhost.lan: OK
- empty -

我已经尝试在将计划任务添加到 app.conf.beat_schedule 之前和之后启动 celery beat,并且在这两种情况下,计划任务从未出现在 celery beat 中。

我读到 celery beat 直到版本 4 才支持动态重新加载配置,但我正在运行 celery beat 4.0.2

我在这里做错了什么?为什么celery beat 不显示我的预定任务?

最佳答案

您是否尝试过使用文档中描述的代码:

@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
    # Calls test('hello') every 10 seconds.
    sender.add_periodic_task(10.0, test.s('hello'), name='add every 10')

?

关于python-3.x - Celery beat 未显示或执行计划任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45731706/

相关文章:

python - Celery:有没有办法编写自定义 JSON 编码器/解码器?

python - celery task_success 与发件人过滤器

django - celery : Execute task after a specific time gap

python-3.x - python3.x中计算ASPECT、SLOPE(matlabgradientm函数)

python-3.x - Matplotlib - 带日期的水平条形图时间线 - Xticks 不显示日期

python - 如何从 Python 中的方法启用字典的代码完成?

python - Reportlab 将报告合并为一个 PDF

django - 无法在夜间更新 Salesforce 对象

celery - celery 拍打不正常

python - 用主管和 virtualenv 监督 celerybeat