【问题标题】:How to debug Celery/Django tasks running locally in Eclipse如何调试在 Eclipse 中本地运行的 Celery/Django 任务
【发布时间】:2012-09-23 18:34:49
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: python eclipse celery


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢,这部分解决了问题。但是如果我需要在不同线程中并行运行任务时进行调试呢?
    • 你看,我真的不需要远程调试它。我只想在 Eclipse 的不同线程中进行本地调试。
    • @TommasoBarbugli 您的链接已损坏。
    • CELERY_ALWAYS_EAGER 在 4.0+ 版本中已重命名为 CELERY_TASK_ALWAYS_EAGER。请参阅this answer 了解更多信息。
    【解决方案2】:

    您可以使用 Celery 的rdb

    from celery.contrib import rdb
    rdb.set_trace()
    

    然后,在不同的终端类型telnet localhost 6900,你会得到调试提示。

    【讨论】:

    • 或端口 6901 - 按照 celery 术语中的消息进行操作
    【解决方案3】:

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

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

    CELERYD_POOL = 'celery.concurrency.threads:TaskPool'
    

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • 不幸的是,似乎仍然与上面在 2.7.3 中描述的完全一样。
        猜你喜欢
        • 2014-12-15
        • 2020-07-25
        • 2020-06-30
        • 2014-03-17
        • 2023-03-24
        • 2019-08-21
        • 2020-04-29
        • 1970-01-01
        • 2011-06-19
        相关资源
        最近更新 更多