【问题标题】:celery task is assigning local instance attributes in subsequent taskscelery 任务在后续任务中分配本地实例属性
【发布时间】:2017-10-27 19:35:56
【问题描述】:

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

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

在随后的任务中它可能会失败,我分配:

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

后续任务应该只分配 meta['error'],但它也会分配上一个 meta['success'] 值,即使 task_history 已重新实例化。

下面是调用任务的代码:

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

下面是任务功能:

@task
def csv_import(file_ids, requester=None):
    task_history = TaskHistory()
    task_history.requester = requester
    task_history.status = 'pending'
    task_history.started = timezone.now()
    task_history.save()
    row_count = 0
    try:

       //main logic goes here

       task_history.status = 'completed'
       task_history.completed = now()
       task_history.meta['success'] = 'Successfully processed {} rows '.format(row_count)
       task_history.save()
    except Exception as e:
        task_history.status = 'failed'
        task_history.completed = timezone.now()
        task_history.meta['error'] = 'Processed {} rows '.format(row_count) + str(e)
        task_history.save()
        raise Exception

【问题讨论】:

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


    【解决方案1】:

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

    meta = JSONField(default=dict)
    

    更多信息可以在这里找到https://docs.djangoproject.com/es/1.9/ref/contrib/postgres/fields/#jsonfield。这是应该用于所有模型默认值的相同标准。

    【讨论】:

      猜你喜欢
      • 2015-07-14
      • 2017-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-30
      • 1970-01-01
      • 1970-01-01
      • 2013-03-19
      相关资源
      最近更新 更多