spo*_*boy 23 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工作线程中执行任务时放置的断点?
Tom*_*gli 37
您应该考虑在与主进程相同的线程中运行celery任务的选项(通常它在一个单独的进程上运行),这将使调试更容易.
您可以通过将此设置添加到settings.py模块来告诉celery同步运行任务:
CELERY_ALWAYS_EAGER = True
Run Code Online (Sandbox Code Playgroud)
注意:这仅用于调试或开发阶段!
sed*_*nym 19
你可以使用Celery的rdb来做到这一点:
from celery.contrib import rdb
rdb.set_trace()
Run Code Online (Sandbox Code Playgroud)
然后,在不同的终端类型中telnet localhost 6900,您将获得调试提示.
CELERYD_POOL默认celery.concurrency.prefork:TaskPool为每个worker生成单独的进程,PyDev无法在其中查看.如果将其更改为其中一个线程选项,则可以使用调试器.
例如,对于Celery 3.1,您可以使用此设置:
CELERYD_POOL = 'celery.concurrency.threads:TaskPool'
Run Code Online (Sandbox Code Playgroud)
请注意,这需要安装线程池模块.
还要确保拥有CELERY_ALWAYS_EAGER = False,否则更改池类是没有意义的.
| 归档时间: |
|
| 查看次数: |
14436 次 |
| 最近记录: |