Celery apply_async报TypeError:schedule_task参数需可迭代而非int的解决方法
解决Celery apply_async 触发的 TypeError 问题
嘿,这个错误其实是个容易踩的小细节坑——你传给apply_async的参数格式不对!
错误原因
Celery的apply_async方法的第一个参数args要求是可迭代对象(比如元组、列表),用来传递任务函数的参数。你现在写的(obj.pk)其实只是一个普通整数(因为单元素不加逗号的话,括号会被当作优先级运算符,不是元组),Celery尝试解析参数时,会把这个int当作要拆分成多个参数的迭代对象,自然就抛出了argument after * must be an iterable, not int的错误。
修复方案
只需要在你的参数后面加个逗号,把它变成单元素元组就行:
# 修改后的视图调用代码 schedule_task.apply_async( (obj.pk,), # 关键:加逗号让它成为单元素元组 expires=datetime.datetime.now() + datetime.timedelta(minutes=5), countdown=int(obj.search_frequency) )
额外提醒
另外注意到你的schedule_task被装饰成了@periodic_task,但你又在视图里手动调用它的apply_async——这其实存在逻辑矛盾:periodic_task是用来配置定时重复执行的任务,如果你是想手动触发单次延迟执行的任务,应该把这个装饰器换成普通的@task,否则这个任务会同时被定时任务系统和你的手动调用触发,大概率会造成重复执行的问题。
修改后的tasks.py示例:
from celery import task import uuid from .models import Task @task(ignore_result=False) def schedule_task(pk): task = Task.objects.get(pk=pk) unique_id = str(uuid.uuid4()) # 这里补充你的任务处理逻辑,比如执行爬虫、更新任务状态等
内容的提问来源于stack exchange,提问作者D_P
相关产品推荐
相关产品推荐

