gevent猴子补丁和断点

Posted

技术标签:

【中文标题】gevent猴子补丁和断点【英文标题】:gevent monkey-patching and breakpoints 【发布时间】:2012-07-14 18:32:09 【问题描述】:

我一直在玩 Gevent,我非常喜欢它。但是我遇到了一个问题。没有命中断点,并且调试不起作用(同时使用 Visual Studio Python 工具和 Eclipse PyDev)。这发生在调用 monkey.patch_all() 之后。

这对我来说是个大问题,不幸的是这是使用 gevent 的障碍。我发现了一个 few threads 似乎表明 gevent 会中断调试,但我想有一个解决方案。

有谁知道如何使调试和断点与 gevent 和猴子补丁一起工作?

【问题讨论】:

好吧,为什么不像我们80年代那样使用“打印”?虽然这并不完全是您要寻找的东西,但它可能有助于修复一两个错误。 【参考方案1】:

pdb - The Python Debugger

import pdb
pdb.set_trace() # Place this where you want to drop into the python interpreter.

【讨论】:

【参考方案2】:

PyCharm IDE 解决了这个问题。设置配置标志后支持gevent代码调试:http://blog.jetbrains.com/pycharm/2012/08/gevent-debug-support/。

很遗憾,目前我还不知道有什么免费的工具可以调试 gevent。

UPD:有!现在有一个社区版的 PyCharm。

【讨论】:

因为即使在一年左右之后这些线程仍然有用... Jetbrains 现在提供免费的“社区”版本的 Pycharm --jetbrains.com/pycharm/download/index.html【参考方案3】:

我目前使用 Pycharm 2.7.3,我也遇到了 gevent 0.13.8 破坏调试的问题。但是当我更新到gevent 1.0rc3 时,我发现我可以再次正确调试。


旁注:

我现在才知道 Jetbrains 有一个使用配置标志的解决方法。 当我需要使用以下 hack 进行调试时,我正在解决这个问题。老实说,我不知道它为什么起作用,也不知道负面后果是什么。我只是做了一些试验和错误,这恰好允许在使用 grequests 时进行调试。

# overrides the monkeypatch issue which causes debugging in PyDev to not work.
def patch_time():
    return
import gevent.monkey
gevent.monkey.patch_time = patch_time 
import grequests

【讨论】:

【参考方案4】:

最简单、最危险的解决方案是修改标准输入和标准输出:

import gevent.monkey
gevent.monkey.patch_all(sys=True)

def my_app():
    # ... some code here

    import pdb
    pdb.set_trace()

    # ... some more code here

my_app()

这是非常危险的,因为你冒着 stdin/stdout 行为奇怪的风险 在您的应用程序生命周期的其余时间。

相反,您可以使用我编写的库:gtools.pdb。它最小化 仅 pdb 提示的风险:

def my_app():
    # ... some code here

    import gtools.pdb
    gtools.pdb.set_trace()

    # ... some more code here

my_app()

基本上,它的作用是告诉 pdb 使用非阻塞标准输入和标准输出 它的交互式提示。任何正在运行的 greenlets 仍将继续运行 在后台。

如果你想避免依赖,你需要做的就是告诉 pdb 使用 一个 gevent 友好的标准输入和标准输出,如下所示:

import sys
from gevent.fileobject import FileObjectThread as File

def Pdb():
    import pdb
    return pdb.Pdb(stdin=File(sys.stdin), stdout=File(sys.stdout))

def my_app():
    # ... some code here

    Pdb().set_trace()

    # ... some more code here

my_app()

请注意,使用这些解决方案中的任何一个,您都会失去上键、下键 pdb 提示功能see gevent issue patching stdin/stdout。

【讨论】:

【参考方案5】:

在 VS Code 中调试时,

我收到了这个错误:

似乎正在使用 gevent 猴子补丁。请设置一个 环境变量:GEVENT_SUPPORT=True 启用 gevent 调试器中的支持。

为此,在调试launch.json 设置中,我设置了以下内容:

"env": 
    "GEVENT_SUPPORT": "True"
,

【讨论】:

以上是关于gevent猴子补丁和断点的主要内容,如果未能解决你的问题,请参考以下文章

gevent协程之猴子补丁带来的坑

python协程初步--gevent库使用以及解释什么是猴子补丁monkey_patch

Python中的猴子补丁

python的猴子补丁monkey patch

python 高级一点的用法,猴子补丁与元类

odoo 使用协程,异步,gevent,打补丁