【问题标题】:How to schedule tasks in celery beat with canvas functionality如何使用画布功能在 celery beat 中安排任务
【发布时间】:2016-09-10 17:28:28
【问题描述】:

Celery 任务有不能调用子进程的限制。回调和其他画布功能由如何通过各种画布函数调用和关联任务来处理。 但是,当您通过 celery beat 安排任务时,似乎唯一的选择是在没有任何画布功能的情况下调用单个任务。 我需要安排一个有回调的任务。无论如何在芹菜中这样做? 它可能我可以在单个任务中完成我需要的东西,但它会涉及大量的内存开销并且需要很长时间才能执行许多数据库命中。这是个好主意吗?

【问题讨论】:

    标签: celery


    【解决方案1】:

    您可以根据需要生成签名并将其传递到options 字典中。这是一个简单链的工作tasks.py

    from datetime import timedelta
    from celery import Celery, signature
    
    app = Celery('tasks', broker='redis://localhost')
    app.conf.update(
        beat_schedule={'add_divide': {'task': 'tasks.add',
                                      'args': (5, 7),
                                      'schedule': timedelta(seconds=10),
                                       'options': {'queue': 'testq',
                                                   'link': signature('tasks.divide',
                                                                     args=(4, ),
                                                                     queue='testq'
                                                      )
                                             }
                                 }
                      }
    )
    
    
    @app.task
    def add(x, y):
        z = x + y
        print('sum: {0}'.format(z))
        return z
    
    
    @app.task
    def divide(x, y):
        z = x / y
        print('divide: {0}'.format(z))
        return z
    

    运行celery worker -A tasks.celery -Q testq --beat -c1 将输出如下内容:

    [2017-04-07 00:00:00,000: WARNING/PoolWorker-2] sum: 12
    [2017-04-07 00:00:00,050: WARNING/PoolWorker-2] divide: 3
    

    【讨论】:

      最近更新 更多