29

我需要从 Eclipse 调试器调试 Celery 任务。我正在使用 Eclipse、PyDev 和 Django。

首先,我在 Eclipse 中打开我的项目,并在任务函数的开头放置一个断点。

然后,我通过右键单击 PyDev 包资源管理器中的 manage.py 并选择“Debug As->Python Run”并指定“celeryd -l info”作为参数,从 Eclipse 启动 Celery 工作人员。这将启动 MainThread、Mediator 和另外三个从 Eclipse 调试器可见的线程。

之后,我返回 PyDev 视图并通过右键单击项目并选择 Run As/PyDev:Django 启动主应用程序

我的问题是,一旦 mytask.delay() 提交了任务,它就不会在断点处停止。我在任务代码中添加了一些痕迹,因此我可以看到它是在其中一个工作线程中执行的。

那么,当它在 Celery 工作线程中执行时,如何使 Eclipse 调试器停止在任务所在的断点处?

4

5 回答 5

47

您应该考虑在与主进程相同的线程中运行 celery 任务的选项(通常它在单独的进程上运行),这将使调试更加容易。

您可以通过将此设置添加到您的 settings.py 模块来告诉 celery 同步运行任务:

CELERY_TASK_ALWAYS_EAGER  = True
# use this if you are on older versions of celery
# CELERY_ALWAYS_EAGER = True 

注意:这仅用于调试或开发阶段!

于 2012-10-03T09:31:41.007 回答
25

你可以使用 Celery 的rdb来做到这一点:

from celery.contrib import rdb
rdb.set_trace()

然后,在不同的终端类型telnet localhost 6900中,您将获得调试提示。

于 2016-04-18T09:53:00.677 回答
5

CELERYD_POOL默认情况下celery.concurrency.prefork:TaskPool将为每个工作人员生成单独的进程,PyDev 看不到它们内部。如果将其更改为线程选项之一,则可以使用调试器。

例如,对于 Celery 3.1,您可以使用以下设置:

CELERYD_POOL = 'celery.concurrency.threads:TaskPool'

请注意,这需要安装线程池模块。

还要确保有CELERY_ALWAYS_EAGER = False,否则更改池类是没有意义的。

于 2013-07-23T20:50:42.433 回答
1

我创建了一个管理命令来测试任务.. 发现它比从 shell 运行它更容易..

于 2013-11-15T10:22:37.910 回答
-1

如果它只在不同的线程上运行,它应该可以在最新的 PyDev 版本上运行(我认为在生成的线程不会被调试之前存在一个问题,但这已得到修复)。

现在,如果它在不同的进程上启动,您需要使用远程调试器(即使它在同一台机器上)。请参阅: http: //pydev.org/manual_adv_remote_debugger.html

于 2012-10-18T19:33:54.293 回答