Celery从RabbitMQ接收任务却未执行的技术问题求助
我有一个Django项目,已配置Celery + RabbitMQ处理异步任务。调用任务后,RabbitMQ管理界面显示任务存在,Celery日志也打印出任务已接收,但任务实际并未执行——控制台没打印I'm Here,也没创建User对象,同时RabbitMQ队列中有多条"unack"状态的消息。
相关代码与配置
任务代码
@app.task def dummy_task(): print("I'm Here") User.objects.create(username="User1") return "User1 Created!"
视图调用代码
def task_view(request): result = dummy_task.delay() return render(request, 'display_progress.html', context={'task_id': result.task_id})
Celery启动命令
celery -A proj worker -l info --concurrency=2 --without-gossip
Celery运行日志片段
-------------- celery@DESKTOP-8CHJOEG v5.2.7 (dawn-chorus)
--- ***** -----
-- ******* ---- Windows-10-10.0.19044-SP0 2022-08-22 10:10:04
- *** --- * ---
** ---------- [config]
** ---------- .> app: proj:0x23322847880
** ---------- .> transport: amqp://navid:**@localhost:5672//
** ---------- .> results:
*** --- * --- .> concurrency: 2 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** ----- -------------- [queues]
.> celery exchange=celery(direct) key=celery[tasks]
.proj.celery.debug_task
.entitymatching.tasks.create_and_learn_machine
.entitymatching.tasks.dummy_task[2022-08-22 10:10:04,068: INFO/MainProcess] Connected to amqp://navid:**@127.0.0.1:5672//
[2022-08-22 10:10:04,096: INFO/MainProcess] mingle: searching for neighbors
[2022-08-22 10:10:04,334: INFO/SpawnPoolWorker-1] child process 6864 calling self.run()
[2022-08-22 10:10:04,335: INFO/SpawnPoolWorker-2] child process 12420 calling self.run()
[2022-08-22 10:10:05,134: INFO/MainProcess] mingle: all alone
[2022-08-22 10:10:05,142: WARNING/MainProcess] C:\Users\Navid\PycharmProjects\proj\venv\lib\site-packages\celery\fixups\django.py:203: UserWarning: Using settings.DEBUG leads to a memory leak, never use this setting in production environments!
warnings.warn('''Using settings.DEBUG leads to a memory[2022-08-22 10:10:05,142: INFO/MainProcess] celery@DESKTOP-8CHJOEG ready.
[2022-08-22 10:10:05,143: INFO/MainProcess] Task entitymatching.tasks.dummy_task[97f8a2eb-0006-4d53-ba6a-7b9f8649c84a] received
[2022-08-22 10:10:05,144: INFO/MainProcess] Task entitymatching.tasks.dummy_task[17190479-0784-46b1-8dc6-870ead41e9c6] received
[2022-08-22 10:11:36,384: INFO/MainProcess] Task proj.celery.debug_task[af3d633f-7b9a-4441-b375-9ce217a40ab3] received
问题排查与修复方案
1. 解决Windows下Prefork并发的兼容性问题
Celery默认的prefork池依赖Unix系统的fork调用,Windows不支持该机制,会导致worker接收任务后无法执行。
修复方式:
- 改用
solo池启动Celery:
celery -A proj worker -l info --pool=solo --without-gossip
- 或者使用
eventlet异步池(需先安装依赖):
安装依赖:
启动命令:pip install eventletcelery -A proj worker -l info --pool=eventlet --concurrency=2 --without-gossip
2. 关闭Django的DEBUG模式
日志已明确警告DEBUG模式会引发内存泄漏,且该模式下Django的自动重载机制会干扰Celery worker正常运行,导致任务无法执行。
修复方式:
在项目settings.py中修改:
DEBUG = False
如需本地调试,可使用Celery自带的调试工具,避免依赖Django的DEBUG模式。
3. 验证Celery与Django环境绑定正确性
确保Celery worker正确加载Django配置:
- 确认启动命令中的
-A proj指向包含Celery app定义的模块(通常为项目根目录下的proj/celery.py)。 - 确保
celery.py中正确初始化Django环境:
import os from celery import Celery os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings') app = Celery('proj') app.config_from_object('django.conf:settings', namespace='CELERY') app.autodiscover_tasks()
4. 清理RabbitMQ未确认消息
任务处于"unack"状态是因为worker无法处理任务导致消息未被确认,清理步骤:
- 停止所有Celery worker进程。
- 在RabbitMQ管理界面进入对应队列,点击"Purge"清空队列。
- 启动修复后的Celery worker,重新测试任务。
内容的提问来源于stack exchange,提问作者Navid777

