我正在使用芹菜和芹菜来处理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 回答
您是否尝试过使用文档中描述的代码:
?