Celery任务运行更多任务

Man*_*tis 47 python django task celery

我正在使用celerybeat开始执行许多次要任务的主要任务.我已经写了两个任务.

有没有办法轻松做到这一点?Celery是否允许从任务中运行任务?

我的例子:

@task
def compute(users=None):
    if users is None:
        users = User.objects.all()

    tasks = []
    for user in users:
        tasks.append(compute_for_user.subtask((user.id,)))

    job = TaskSet(tasks)
    job.apply_async() # raises a IOError: Socket closed

@task
def compute_for_user(user_id):
    #do some stuff
Run Code Online (Sandbox Code Playgroud)

compute从celerybeat调用,但在尝试运行时会导致IOError apply_async.有任何想法吗?

Jer*_*man 29

回答您的开场问题:从2.0版本开始,Celery提供了一种从其他任务启动任务的简便方法.你称之为"次要任务"的是它所谓的"子任务".请参阅@Paperino足以链接到的任务集,子任务和回调文档.

对于3.0版,Celery更改为使用以及其他类型的行为.

您的代码显示您已熟悉此界面.你的实际问题似乎是," IOError当我尝试运行我的子任务时,为什么我得到'Socket Closed' ?" 我认为没有人可以回答这个问题,因为您没有提供有关您的计划的足够信息.你的摘录不能按原样运行,所以我们无法检查你为自己所拥有的问题.请发布IOError随附的堆栈跟踪,如果幸运的话,有人可以帮助您使用crasher.


mic*_*mit 9

而且,因为版本3.0'TaskSet'不再是这个术语...组,链和弦作为一种特殊类型的子任务是新的东西,请参阅http://docs.celeryproject.org/en/3.1/whatsnew-3.0的.html#组和弦链是-现在,子任务


Abh*_*eph 9

你可以使用这样的东西(3.0中支持)

g = group(compute_for_user.s(user.id) for user in users)
g.apply_async()
Run Code Online (Sandbox Code Playgroud)