如何调试在Eclipse中本地运行的Celery / Django任务

时间:2012-10-02 20:57:24

标签: python eclipse celery

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

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

然后,我通过右键单击来自PyDev Package Explorer的manage.py并选择“Debug As-> Python Run”并指定“celeryd -l info”作为参数,从Eclipse启动Celery worker。这将启动MainThread,Mediator以及Eclipse调试器中可见的另外三个线程。

之后我返回到PyDev视图,通过右键单击项目并选择Run As / PyDev:Django

启动主应用程序

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

那么,如何让Eclipse调试器停止在Celery工作线程中执行任务时放置的断点?

5 个答案:

答案 0 :(得分:36)

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

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

CELERY_ALWAYS_EAGER = True

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

答案 1 :(得分:18)

您可以使用Celery的rdb

来完成
from celery.contrib import rdb
rdb.set_trace()

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

答案 2 :(得分:5)

CELERYD_POOL默认为celery.concurrency.prefork:TaskPool,这将为每个工作程序生成单独的进程,而PyDev无法在其中查看。如果将其更改为其中一个线程选项,则可以使用调试器。

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

CELERYD_POOL = 'celery.concurrency.threads:TaskPool'

请注意,这需要安装threadpool模块。

同时确保拥有CELERY_ALWAYS_EAGER = False,否则更改池类是没有意义的。

答案 3 :(得分:0)

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

答案 4 :(得分:-1)

如果它仅在不同的线程上运行,它应该适用于最新的PyDev版本(我认为在生成的线程无法调试之前存在问题,但这是固定的)。

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