我需要从Eclipse调试器中调试芹菜任务。我使用的是Eclipse、PyDev和Django。
首先,我在Eclipse中打开我的项目,并在任务函数的开头放置一个断点。
然后,通过右键单击PyDev Package Explorer中的manage.py,选择"Debug As->Python Run“并指定"celeryd -l info”作为参数,从Eclipse启动Celery工作程序。这将启动MainThread、Mediator和另外三个从Eclipse调试器中可见的线程。
之后,我返回到PyDev视图,通过右键单击项目并选择Run /PyDev:Django来启动主应用程序
我的问题是,一旦任务由mytask.delay()提交,它就不会在断点处停止。我在任务代码中添加了一些跟踪,这样我就可以看到它是在一个工作线程中执行的。
那么,当Eclipse调试器在Celery worker线程中执行任务时,如何让它在任务所在的断点处停止呢?
发布于 2012-10-03 17:31:41
您应该考虑在与主进程相同的线程中运行celery任务(通常它在单独的进程上运行),这将使调试变得更容易。
您可以通过将以下设置添加到settings.py模块来告诉celery同步运行任务:
CELERY_TASK_ALWAYS_EAGER = True
# use this if you are on older versions of celery
# CELERY_ALWAYS_EAGER = True
注意:这仅用于调试或开发阶段!
发布于 2016-04-18 17:53:01
你可以使用Celery的rdb来做这件事
from celery.contrib import rdb
rdb.set_trace()
然后,在不同的终端中键入telnet localhost 6900
,您将得到调试提示符。
发布于 2013-07-24 04:50:42
CELERYD_POOL默认为celery.concurrency.prefork:TaskPool
,它将为每个工作进程生成单独的进程,并且PyDev看不到它们的内部。如果将其更改为threaded选项之一,则可以使用调试器。
例如,对于Celery 3.1,您可以使用此设置:
CELERYD_POOL = 'celery.concurrency.threads:TaskPool'
请注意,这需要安装threadpool模块。
还要确保拥有CELERY_ALWAYS_EAGER = False
,否则更改pool类没有任何意义。
https://stackoverflow.com/questions/12698212
复制相似问题