Celery任务调用time.sleep()报NameError的问题求助
解决Celery异步任务中NameError异常问题
问题核心分析
虽然报错信息指向print_log调用行,但错误提示是name 'sleep' is not defined,且同步调用任务正常、异步调用失败,核心原因大概率是Celery Worker的代码缓存未更新:
- 同步调用时,直接执行当前IDE中的最新代码;
- 异步调用时,由独立的Worker进程执行,若Worker未重启,会一直使用启动时加载的旧版本代码(比如你之前的代码中存在
sleep未正确导入的情况,后续修改后Worker没同步更新)。
具体解决步骤
强制重启Celery Worker
停止所有运行中的Worker进程,再重新启动,确保Worker加载最新代码:# 查找并终止Celery Worker进程 ps aux | grep celery | grep -v grep | awk '{print $2}' | xargs kill -9 # 重新启动Worker(替换为你的项目名) celery -A your_project_name worker --loglevel=info检查
print_log函数实现
排查print_log内部是否存在对sleep的引用,或该函数的依赖是否正确导入——旧版本的print_log可能误用了未定义的sleep,导致Worker缓存的代码触发异常。规范代码导入逻辑
将所有导入语句移至文件顶部,避免函数/循环内的动态导入,减少作用域和缓存问题:import time from celery import shared_task # 确保print_log正确定义或导入 def print_log(message): # 你的日志实现,比如: print(message) @shared_task() def testtask(num=100): for i in range(num): print_log(f"in testtask {i}") time.sleep(1) return验证代码一致性
若Worker部署在远程服务器,确认服务器上的代码与本地IDE中的代码完全同步,不存在文件未更新的情况。
内容的提问来源于stack exchange,提问作者Prasanna
相关产品推荐
相关产品推荐

