【问题标题】:Django Celery Invoking Periodically and ManuallyDjango Celery 定期手动调用
【发布时间】:2020-02-21 05:33:01
【问题描述】:

我正在使用 Django 和 Celery 来安排任务。

tasks.py

@periodic_task(run_every=crontab(hour='00', minute='00', day_of_week="*"))
def hello_world():
    print('hello world!)

除了每天运行该函数之外,我还需要能够手动调用它。如果用户按下前端的按钮,它将运行。我可以这样做:

@periodic_task(run_every=crontab(hour='00', minute='00', day_of_week="*"))
def hello_world():
    print('hello world!)

@task()
def hello_world():
    print('hello world!)

但这不符合 DRY。此外,我可能有多个具有相同场景的函数。我需要定期运行它,但也应要求运行。

我试过了:

def hello_world():
    print('hello world!)

@periodic_task(run_every=crontab(hour='00', minute='00', day_of_week="*"))
hello_world()

@task
hello_world()

但这不起作用。我明白了

无效语法

我无法在文档或其他 stackoverflow 答案中找到这种情况。他们谈论从 shell 调用函数。帮助将不胜感激。

谢谢!

【问题讨论】:

    标签: django python-3.x celery celery-task


    【解决方案1】:

    你不需要定义两次任务,你的周期性任务也可以用hello_world.delay()手动调用,所以你会:

    @periodic_task(run_every=crontab(hour='00', minute='00', day_of_week='*'))
    def hello_world():
        print('hello world!')
    
    def on_button_press():
        hello_world.delay()
    

    【讨论】:

    • 谢谢!我会试试的。我需要多个工人吗?一个用于定期,另一个用于手册?还是会由同一个工人同时接手?
    • 不,不一定,无论您决定如何分配工作负载,它都会起作用
    • 我使用了相同的工作人员,现在我得到:“收到类型为 'apps.app.tasks.hello_world' 的未注册任务。该消息已被忽略并丢弃。你记得导入模块吗包含这个任务?或者也许你正在使用相对导入?它是红色字体,这最终会让工人失败吗?
    猜你喜欢
    • 2012-10-05
    • 2019-01-07
    • 2014-02-23
    • 2013-07-05
    • 2019-06-28
    • 2022-01-01
    • 2019-06-09
    • 2017-01-06
    • 2012-05-09
    相关资源
    最近更新 更多