Celery任务的结果错误 “参数必须是列表或元组“

在运行Django网站时,通过Celery运行任务,遇到错误提示“参数必须是列表或元组”。
在这里插入图片描述

代码结构如下:

  • tests.py:
from tasks import *
from celery.result import AsyncResult

project = Project.objects.create()
# 初始化项目的各种子对象

c = function.delay(project.id)
r = AsyncResult(c.id).ready()
f = AsyncResult(c.id).failed()
# 等待任务完成

self.assertEqual() # 任务失败时会失败
  • tasks.py:
from __future__ import absolute_import
from celery import shared_task

@shared_task
def function(project_id)
    # 一系列计算,然后保存项目
    project = Project.objects.get(project=project_id)

    for part in project.part_set.all():
        partFunction(part.id)
        p = Part.objects.get(id=part.id)
        # 从 p 中的变量添加到项目中的各个变量
    project.save()
  • mainapp/settings.py:
BROKER_URL = "amqp://ipaddress"
CELERY_RESULT_BACKEND='amqp'
CELERY_ACCEPT_CONTENT = ['json','pickle','msgpack','yaml']
CELERY_IGNORE_RESULT = False

Celery调试控制台日志提示“参数必须是列表或元组”:

[INFO/MainProcess] Received task: myapp.tasks.function[id]
[ERROR/MainProcess] Task myapp.tasks.function[id]
    raised unexpected: ValueError('task args must be a list or tuple',)
Traceback:
   File "/python2.7/site-packages/celery/app/trace.py", line 240, in trace_task
       R = retval = fun(*args, **kwargs)
   File "/python2.7/site-packages/celery/app/trace.py", line 437, in __protected_call__
       return self.run(*args, **kwargs)
   File "/myapp/tasks.py", line 28, in function
       p = Part.objects.get(id=part.id)
   File "/python2.7/site-packages/celery/app/task.py", line 555, in apply_async
       **dict(self._get_exec_options(), **options)
   File "/python2.7/site-packages/celery/app/base.py", line 351, in send_task
       reply_to=reply_to or self.oid, **options
   File "celery/app/amqp.py", line 252, in publish_task
       raise ValueError('task args must be a list or tuple')
ValueError: task args must be a list or tuple

尝试将任务参数设置为列表,但又提示“int() 参数必须是字符串或数字,而不是“列表””。

2、解决方案

要解决此问题,可以采取以下步骤:

  1. 重新启动 Celery。这是因为 Celery 在每次修改 tasks.py 文件时都会对任务进行预先加载。如果不重新启动 Celery,它将继续使用旧的、不正确的任务。

  2. 检查任务参数的类型。任务参数必须是列表或元组。如果参数是其他类型,需要将其转换为列表或元组。

  3. 确保任务以正确的方式被调用。任务可以使用 delay() 方法或 apply_async() 方法调用。如果使用 delay() 方法,参数必须是一个列表或元组。如果使用 apply_async() 方法,参数可以是一个列表、元组或字典。

  4. 检查任务是否真的失败了。有时,任务可能会返回一个错误,即使任务已经成功完成。这是因为任务可能在处理过程中遇到了临时错误。如果任务确实失败了,可以检查任务的日志以获取更多详细信息。

此外,在使用 Celery 时,还需要注意以下几点:

  • 任务必须使用 @task 或 @shared_task 装饰器进行装饰。
  • 任务必须位于一个 Python 模块中。
  • 任务模块必须添加到 Celery 应用的配置中。
  • Celery 必须正确配置并运行。
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值