我需要从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工作线程中执行任务时放置的断点?
答案 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