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调试芹菜工人的主要内容,如果未能解决你的问题,请参考以下文章