我正在使用 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 提供了一种从其他任务启动任务的简单方法。你所说的“次要任务”就是它所说的“子任务”。请参阅 Sets of tasks, Subtasks and Callbacks 的文档,@Paperino 可以链接到该文档。
对于 3.0 版,Celery 更改为使用 groups 来处理这种和其他类型的行为。
您的代码表明您已经熟悉此界面。您的实际问题似乎是,“当我尝试运行我的子任务集时,为什么会收到 'Socket Closed' IOError
?”我认为没有人能回答这个问题,因为你没有提供足够的关于你的程序的信息。您的摘录不能按原样运行,因此我们无法自行检查您遇到的问题。请发布随 IOError
一起提供的堆栈跟踪,如果运气好,可以帮助您解决崩溃问题的人会出现。
关于python - 运行更多任务的 celery 任务,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6349371/