首页 文章

Celery beat未显示或执行计划任务

提问于
浏览
2

我正在使用芹菜和芹菜来处理Python项目中的任务执行和计划任务 . I am not using django .

执行 celery tasks is working as expected . 然而,我遇到了试图让计划任务(芹菜击败)运行的墙 .

我已按照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

我在同一个应用程序文件中手动运行芹菜 Worker 和芹菜同时(在不同的终端窗口中):

$ celery worker -A gateway --loglevel=INFO
$ celery beat -A gateway --loglevel=DEBUG

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

但是,芹菜节拍过程从未显示计划任务已注册的任何迹象:

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@localhost.lan: OK
- empty -

我已经尝试在将计划任务添加到app.conf.beat_schedule之前和之后启动celery beat,并且在两种情况下,计划任务都不会出现在芹菜节拍中 .

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

我在这做错了什么?为什么芹菜不能显示我的预定任务?

1 回答

  • 0

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

    @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')
    

相关问题