写了一个 celery 的 worker ,和一个 run_celery.py ,
from myapp.celery import app as celery_app celery_app.worker_main(argv=['worker', '--loglevel=debug', '-E', '-P', 'eventlet'])
用他启动会显示
[2024-06-06 11:28:27,149: INFO/MainProcess] Task home_application.tasks.handle_query_task[fc8f1d5e-f785-4f5e-bab8-73ba23c81217] received [2024-06-06 11:28:27,150: DEBUG/MainProcess] TaskPool: Apply <function fast_trace_task at 0x000001F03B30EA60> (args:('home_application.tasks.handle_query_task', 'fc8f1d5e-f785-4f5e-bab8-73ba23c81217'
就卡住了。
但是用celery -A myapp worker --loglevel=debug -E -P eventlet
启动,就能正常处理工作。
app/init.py
from __future__ import absolute_import, unicode_literals from .celery import app as celery_app __all__ = ('celery_app',)
app/celery.py
from __future__ import absolute_import, unicode_literals import os from celery import Celery from myapp import settings os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myapp.settings') app = Celery('myapp') app.config_from_object('django.conf:settings', namespace='CELERY') app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
home_application/tasks.py
@app.task def handle_query_task(task_id, *args, **kwargs): return {"status": 1, "error": "test"}
![]() | 1 Spute 2024-06-06 11:58:14 +08:00 celery 是个基于生产消费模型的分布式任务队列,worker 只是消费者,所以你是不是没有生产任务?所以 worker 会“卡住”。 |
![]() | 2 guoguobaba OP @Spute 显然不是啊,有命令行对比的,有命令传过来 |
![]() | 3 zhoudaiyu PRO strace 一下卡主的进程,看看在干啥 |
4 hhz 2024-06-06 14:00:23 +08:00 windows 下启动的? |
![]() | 5 Hopetree 2024-06-06 14:51:24 +08:00 在 Django 里面使用本身就要在命令行中启动运行,看看我这篇文章的使用,你可以使用进程管理工具,同时启动 Django 和 celery 的进程,https://tendcode.com/subject/article/django-celery/ |
6 fcfangcc 2024-06-06 17:34:43 +08:00 因为命令行启动调用的不是 celery_app.worker_main ,是这个里面的方法 https://github.com/celery/celery/blob/main/celery/bin/worker.py#L298 ,我猜里面做了额外操作,可以参考他里面的逻辑 |