V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
guoguobaba
V2EX  ›  Python

celery 库的问题

  •  
  •   guoguobaba · 16 天前 · 1013 次点击

    写了一个 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"}
    
    6 条回复    2024-06-06 17:34:43 +08:00
    Spute
        1
    Spute  
       16 天前
    celery 是个基于生产消费模型的分布式任务队列,worker 只是消费者,所以你是不是没有生产任务?所以 worker 会“卡住”。
    guoguobaba
        2
    guoguobaba  
    OP
       16 天前
    @Spute 显然不是啊,有命令行对比的,有命令传过来
    zhoudaiyu
        3
    zhoudaiyu  
       16 天前 via iPhone
    strace 一下卡主的进程,看看在干啥
    hhz
        4
    hhz  
       16 天前
    windows 下启动的?
    Hopetree
        5
    Hopetree  
       16 天前
    在 Django 里面使用本身就要在命令行中启动运行,看看我这篇文章的使用,你可以使用进程管理工具,同时启动 Django 和 celery 的进程,https://tendcode.com/subject/article/django-celery/
    fcfangcc
        6
    fcfangcc  
       16 天前
    因为命令行启动调用的不是 celery_app.worker_main ,是这个里面的方法 https://github.com/celery/celery/blob/main/celery/bin/worker.py#L298 ,我猜里面做了额外操作,可以参考他里面的逻辑
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2110 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 01:43 · PVG 09:43 · LAX 18:43 · JFK 21:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.