如何使用画布功能在芹菜中安排任务

时间:2016-09-10 17:28:29

标签: celery

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

1 个答案:

答案 0 :(得分:3)

您可以为您需要的任何内容生成签名,并将其传递到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