如何调试在 Eclipse 中本地运行的 Celery/Django 任务
Posted
技术标签:
【中文标题】如何调试在 Eclipse 中本地运行的 Celery/Django 任务【英文标题】:How to debug Celery/Django tasks running locally in Eclipse 【发布时间】:2012-09-23 18:34:49 【问题描述】:我需要从 Eclipse 调试器调试 Celery 任务。 我正在使用 Eclipse、PyDev 和 Django。
首先,我在 Eclipse 中打开我的项目并在任务函数的开头放置一个断点。
然后,我通过在 PyDev 包资源管理器中右键单击 manage.py 并选择“Debug As->Python Run”并指定“celeryd -l info”作为参数,从 Eclipse 启动 Celery worker。这将启动 MainThread、Mediator 和另外三个从 Eclipse 调试器可见的线程。
之后我返回 PyDev 视图并通过右键单击项目并选择 Run As/PyDev:Django 启动主应用程序
我的问题是,一旦任务由 mytask.delay() 提交,它就不会在断点处停止。我在任务代码中添加了一些痕迹,因此我可以看到它是在其中一个工作线程中执行的。
那么,当 Eclipse 调试器在 Celery 工作线程中执行时,如何让 Eclipse 调试器停止在任务所在的断点处?
【问题讨论】:
【参考方案1】:您应该考虑在与主进程相同的线程中运行 celery 任务的选项(通常它在单独的进程上运行),这将使调试更加容易。
您可以通过将此设置添加到您的 settings.py 模块来告诉 celery 同步运行任务:
CELERY_TASK_ALWAYS_EAGER = True
# use this if you are on older versions of celery
# CELERY_ALWAYS_EAGER = True
注意:这仅用于调试或开发阶段!
【讨论】:
谢谢,这部分解决了问题。但是如果我需要在不同线程中并行运行任务时进行调试呢? pdb 呢?看这里docs.celeryproject.org/en/latest/tutorials/debugging.html 你看,我真的不需要远程调试它。我只想在 Eclipse 的不同线程中进行本地调试。 @TommasoBarbugli 您的链接已损坏。CELERY_ALWAYS_EAGER
在 4.0+ 版本中已重命名为 CELERY_TASK_ALWAYS_EAGER
。请参阅this answer 了解更多信息。【参考方案2】:
您可以使用 Celery 的rdb:
from celery.contrib import rdb
rdb.set_trace()
然后,在不同的终端类型telnet localhost 6900
,你会得到调试提示。
【讨论】:
或端口 6901 - 按照 celery 术语中的消息进行操作【参考方案3】:CELERYD_POOL 默认为celery.concurrency.prefork:TaskPool
,它将为每个工作人员生成单独的进程,PyDev 无法看到它们内部。如果将其更改为线程选项之一,则可以使用调试器。
例如,对于 Celery 3.1,您可以使用以下设置:
CELERYD_POOL = 'celery.concurrency.threads:TaskPool'
请注意,这需要安装 threadpool 模块。
还要确保有CELERY_ALWAYS_EAGER = False
,否则更改池类没有意义。
【讨论】:
【参考方案4】:我创建了一个管理命令来测试任务..发现它比从 shell 运行它更容易..
【讨论】:
【参考方案5】:如果它只在不同的线程上运行,它应该可以在最新的 PyDev 版本上运行(我认为在生成的线程不会被调试之前存在一个问题,但这个问题已修复)。
现在,如果它在不同的进程上启动,您需要使用远程调试器(即使它在同一台机器上)。见:http://pydev.org/manual_adv_remote_debugger.html
【讨论】:
不幸的是,似乎仍然与上面在 2.7.3 中描述的完全一样。以上是关于如何调试在 Eclipse 中本地运行的 Celery/Django 任务的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Eclipse 调试 hadoop mapreduce 作业?