Windows下Celery运行Scrapy提示ModuleNotFoundError: No module named 'app_celery'求助
问题根因
- 跨平台进程启动机制差异:Windows 下 Python 的
multiprocessing库默认使用 spawn 模式创建子进程,而 Linux 默认使用 fork 模式。spawn 模式下子进程启动时会重新导入项目的根模块,若你启动 Celery 时的工作目录没有被加入 Python 的模块搜索路径sys.path,就会出现找不到app_celery模块的报错。 - 代码逻辑错误:你创建多进程对象时给
target参数传的是scrape_data(),加了括号等于直接在当前 Celery 任务进程中同步执行了scrape_data函数,并没有把函数对象传递给子进程,也会导致逻辑异常。
解决方案
- 修正代码参数错误:去掉
target对应参数的括号,改为传递函数对象本身:
# 修正前 a = multiprocessing.Process(target=scrape_data()) # 修正后 a = multiprocessing.Process(target=scrape_data)
- 在
app_celery.py文件最顶部添加代码,手动把当前文件所在目录加入 Python 模块搜索路径:
import sys import os sys.path.insert(0, os.path.abspath(os.path.dirname(__file__)))
- 如果你不想修改代码,也可以在启动 Celery 前先设置 PYTHONPATH 环境变量,Windows cmd 下执行命令如下:
set PYTHONPATH=%cd%;%PYTHONPATH% celery -A app_celery worker -c 4 -n worker1 --pool threads
- 额外优化建议:你当前已经使用了
--pool threads线程池启动 Celery,不需要额外嵌套开multiprocessing子进程跑 Scrapy 任务,直接在 Celery 任务函数内调用scrape_data()即可,既可以减少不必要的资源开销,也能直接规避跨平台多进程导入的问题。
内容的提问来源于stack exchange,提问作者iam.mattevans
相关产品推荐
相关产品推荐

