芹菜任务,运行更多的任务

我正在使用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 

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

回答开放性问题:从版本2.0开始,Celery提供了一个简单的方法来启动其他任务的任务。 你所称的“次要任务”就是所谓的“子任务”。 请参阅@Paperino适合链接的任务,子任务和callback集文档。

对于版本3.0,芹菜更改为使用组和其他types的行为。

你的代码显示你已经熟悉了这个接口。 你的实际问题似乎是,“当我尝试运行我的子任务集时,为什么会得到'套接字closures' IOError ? 我不认为有人可以回答,因为你没有提供足够的关于你的程序的信息。 您的摘录不能按原样运行,所以我们无法检查您自己的问题。 请发布随IOError一起提供的堆栈跟踪,如果运气好的话,那些可以帮助你的人也会出现。

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

 g = group(compute_for_user.s(user.id) for user in users) g.apply_async() 

而从3.0版开始,“TaskSet”不再是这个词了…作为特殊types的子任务,Groups,Chains和Chords是新事物,参见http://docs.celeryproject.org/en/3.1/whatsnew-3.0的.html#组和弦链是-现在,子任务