如何调试在 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 作业?

从 IntelliJ 调试 Eclipse Wildfly

如何在 SSH 下远程使用 IDE 编译和调试

如何在 Eclipse 中启动 gdb 调试之前运行 linux 脚本

如何在 Eclipse 中调试 Apache Storm?

源代码方式调试Mycat