VSCode调试芹菜工人

Posted

技术标签:

【中文标题】VSCode调试芹菜工人【英文标题】:VSCode debug Celery worker 【发布时间】:2020-01-02 13:04:26 【问题描述】:

在运行了一些令人沮丧的日子之后,我需要查看在 VSCode 中调试 celery 工作进程。这遵循 Celery 文档中建议的创建消息处理程序的过程,而不是来自同一应用程序的 pub/sub。

celery.py 文件:

from __future__ import absolute_import, unicode_literals
import os
import json

from celery import Celery, bootsteps
from kombu import Consumer, Exchange, Queue

dataFeedQueue = Queue('statistical_forecasting', Exchange('forecasting_event_bus', 'direct', durable=False), 'DataFeedUpdatedIntegrationEvent')

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.local')

app = Celery('statistical_forecasting')
app.config_from_object('django.conf:settings', namespace='CELERY')

# Not required yet as handler is within this file
#app.autodiscover_tasks()


class DataFeedUpdatedHandler(bootsteps.ConsumerStep):
    def get_consumers(self, channel):
        return [Consumer(channel, queues=[dataFeedQueue],    callbacks=[self.handle_message], accept=['json'])]


def handle_message(self, body, message):
    event = json.loads(body)

    # removed for brevity, but at present echo's message content with print

    message.ack()

app.steps['consumer'].add(DataFeedUpdatedHandler)

我的项目结构简写为:

workspace -
    vscode -
        - launch.json
    config -
        __init__.py            
        settings -
            local.py
    venv -
        celery.exe
    statistical_forecasting -
        __init__.py
        celery.py
        farms -
            __init__.py
            handlers.py    # ultimately handler code should live here...

从启用 venv 的终端,我正在运行 celery -A statistical_forecasting worker -l info,它似乎确实成功地设置和运行了基本消息处理程序。

到目前为止,我使用 VSCode 尝试的是在 launch.json 中设置以下配置


    "version": "0.2.0",
    "configurations": [
    
        "name": "Python: Celery",
        "type": "python",
        "request": "launch",
        "module": "celery",
        "console": "integratedTerminal",
        //"program": "$workspaceFolder\\env\\Scripts\\celery.exe",
        "args": [
            "worker",
            "-A statistical_forecasting",
            "-l info",
            ]
        ,
    ]

不幸的是,这只会导致以下消息:

Error:
Unable to load celery application.
The module  statistical_forecasting was not found.

从逻辑上讲,我可以推断调试应该从工作区目录运行celery,并且它应该看到statistical_forecasting 目录和__init__.py 技术使其成为一个模块?

我尝试了其他各种想法,例如在lauch.json 设置虚拟环境等中强制program,但都返回相同的基本错误消息。

statistical_forecasting 中的“init.py”包含标准的 Django 设置,我不相信它是必需的,因为 celery 任务是在 Django 之外运行的,我不打算发布/接收来自 Django 应用程序。

【问题讨论】:

我认为关于 SO 的每 10 个 django+celery 问题都是关于未找到模块的......这通常可以通过正确设置 PYTHONPATH 或类似方法来解决。这些错误与 celery 或 django 无关,而是您如何运行软件... 被指控有罪 :-( 这里的问题正在解决它需要设置的位置... VSCode 应该选择 PYTHONPATH,理论上应该在代码中选择 DJANGO_SETTINGS_MODULE... camelCasing在示例中应该表明我主要是 C# 开发人员,所以请善待:-) 我很乐意提供帮助,但我不使用 django,而且我通常会避免 django+celery 问题,因为它们经常与配置 django 环境有关。如果您收到该模块未找到错误,这通常意味着您的 Python 解释器在错误的目录中运行。当然将 PYTHONPATH 设置为 statistics_forecasting.py 所在的文件夹可能会有所帮助,但它也可能会破坏其他一些代码...... 别担心,我会尝试在 VsCode 中设置不同的路径,看看它是否有助于发现模块。感谢您的评论; Stack Overflow 有时感觉就像在无人听的情况下对着虚空大喊。 @DejanLekic 这是参数的格式!请参阅下面的答案。 【参考方案1】:

为了其他尝试这样做的人的利益,这是我将 celery 作为模块测试的最小配置

    
        "name": "Python: Celery",
        "module": "celery",
        "console": "integratedTerminal",
        "args": [
            "worker",
            "--app=statistical_forecasting",
            "--loglevel=INFO",
        ],
    ,

关键的外卖 id 参数是如何格式化的。原始版本使用的是您在从命令行运行时通常会看到的缩短版本,例如在教程中。

通常您会看到celery -A statistical_forecasting worker -l info 以使调试器工作,您需要更完整的版本celery --app=statistical_forecasting worker --loglevel=INFO

反映它下面的 cmets 也可以:

    
        "name": "Python: Celery",
        "module": "celery",
        "console": "integratedTerminal",
        "args": [
            "worker",
            "-A",
            "statistical_forecasting",
            "-l",
            "info",
        ],
    ,

出于兴趣,较长的版本如下,但这主要只是重复了 VsCode 默认设置的内容:

    
        "name": "Python: Celery",
        "type": "python",
        "request": "launch",
        "module": "celery",
        "console": "integratedTerminal",
        "cwd": "$workspaceFolder",
        "program": "$workspaceFolder\\env\\Scripts\\celery.exe",
        "pythonPath": "$config:python.pythonPath",
        "args": [
            "worker",
            "--app=statistical_forecasting",
            "--loglevel=INFO",
        ],
        "env":
            "DJANGO_SETTINGS_MODULE": "config.settings.local",
        
    ,

【讨论】:

我认为 --app=blabla 适合您的原因是因为当您使用 -A 时,您需要 args 数组中的两个单独元素。这也应该有效:"args": ["worker", "-A", "statistical_forecasting", "--loglevel=INFO"] 当然!!!,它将参数作为数组传递。我也以这种方式更新了答案。

以上是关于VSCode调试芹菜工人的主要内容,如果未能解决你的问题,请参考以下文章

暂时禁用芹菜中的分布式处理

芹菜。运行单个芹菜节拍 + 多个芹菜工人规模

芹菜工人在 aws 弹性豆茎中失败 [退出:芹菜工人(退出状态 1;未预期)]

从芹菜任务中获取芹菜工人的名字?

芹菜多里面码头工人容器

如何使用芹菜工人将 django 项目部署到谷歌云?