celery task在后续任务中分配本地实例属性

时间:2017-10-27 19:35:56

标签: python python-3.x celery django-celery celery-task

我有一个任务,每次处理新任务时都会创建一个任务历史记录。我在任务函数的开头实例化一个新的TaskHistory实例。由于某种原因,在先前任务中分配的TaskHistory类属性被分配给后续任务中的TaskHistory类属性。例如,如果任务成功,我指定:

public IsCurrentUserAdmin(): Promise<Boolean> {
const isAdminData = await httpService.goGetTheData();
// do something with the data to get the value
return isAdmin;
}

在后续任务中,它可能会失败,我指定:

 task_history.meta['success'] = 'Successfully processed {} rows '.format(row_count)'

后续任务应该只分配元[&#39;错误&#39;],但即使task_history已重新实例化,它也会分配先前的元[&#39;成功]值。

以下是调用任务的代码:

task_history.meta['error'] = 'Processed {} rows '.format(row_count) + str(e)

以下是任务功能:

args = [file_ids]
kwargs = {'requester': request.user.profile}
csv_import.apply_async(args=args, kwargs=kwargs)

1 个答案:

答案 0 :(得分:0)

最后这与芹菜无关,但我在模型中设置了meta字段的默认值。元字段是 JSONfield(),我将默认值设置为 default = {} ,它创建了一个可变实例,并在JSONfield的所有实例之间共享。我通过将其设置为可调用的 dict 来修复此问题。现在,新字段显示如下:

meta = JSONField(default=dict)

有关此内容的更多信息,请访问https://docs.djangoproject.com/es/1.9/ref/contrib/postgres/fields/#jsonfield。这与所有模型默认值应使用的标准相同。