我想用Celery在Flask上执行cron作业,但是关于芹菜节拍时间表,我遇到了一个问题,因为似乎我的任务未加载,并且我不知道如何检查问题所在。
这是我在views.py中定义Flask应用的地方:
from celery.schedules import crontab
app = Flask(__name__)
app.config.update(
CELERY_BROKER_URL='redis://localhost:6379',
CELERY_RESULT_BACKEND='redis://localhost:6379',
CELERY_BEAT_SCHEDULE={
'task-number-one': {
'task': 'app.tasks.test',
'schedule': crontab(minute="*"),
}
},
CELERY_IMPORTS = ('app.tasks'),
CELERY_TASK_RESULT_EXPIRES = 30,
CELERY_TIMEZONE = 'UTC',
)
这是在task.py中创建我的芹菜对象的地方:
from celery import Celery
from app.views import app
from celery import shared_task
def make_celery(app):
celery = Celery(app.import_name, backend=app.config['CELERY_RESULT_BACKEND'],
broker=app.config['CELERY_BROKER_URL'])
celery.conf.update(app.config)
TaskBase = celery.Task
class ContextTask(TaskBase):
abstract = True
def __call__(self, *args, **kwargs):
with app.app_context():
return TaskBase.__call__(self, *args, **kwargs)
celery.Task = ContextTask
return celery
celery_app = make_celery(app)
@celery_app.task()
def test():
logger = test.get_logger()
logger.info("Hello")
views.py和task.py位于相同的目录下,称为app
但这是我启动芹菜节拍时所拥有的,似乎我的任务从未按时间表发送,但我不知道在哪里检查:
您能帮我吗? 最好
答案 0 :(得分:0)
我认为,至少在发送@app.on_after_configure.connect
信号之后,才需要配置Celery-Beat任务。您应该能够在task.py文件中执行以下操作。
celery_app.conf.CELERYBEAT_SCHEDULE = {
"test-every-minue": {
"task": "tasks.test",
"schedule": crontab(minute="*"),
},
}
或者,如果您的任务与celery应用程序实例在同一文件中定义,则可以使用这种装饰器语法。
@celery_app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
sender.add_periodic_task(5 , test_two.s(), name='test-every-5')
如果您的任务是在单独的模块中定义的,则可以在导入任务后使用@app.on_after_finalize.connect
装饰器。
@app.on_after_finalize.connect
def setup_periodic_tasks(sender, **kwargs):
from app.tasks import test
sender.add_periodic_task(10.0, test.s(), name='test-every-10')