Django中修补Python模块时的Gevent异常

3

我已经安装了 geventgreenlet 库,并在我的Django应用程序的 __init__.py 文件中添加了以下两行代码:

from gevent import monkey
monkey.patch_all()

现在我经常在我的Django控制台中看到错误,内容如下:

Exception KeyError: KeyError(27066240,) in <module 'threading' from 'C:\Program_Files\Python27\Lib\threading.pyc'> ignored

当我删除这两行时,我的应用程序就可以正常工作了。以下是我在Windows机器上使用的软件包列表。
django-erroneous - 0.1.0       - active
Django          - 1.3.1        - active
gevent          - 0.13.6       - active
greenlet        - 0.3.3        - active
lxml            - 2.3.3        - active
PIL             - 1.1.7        - active
pip             - 1.0.2        - active
setuptools      - 0.6c11       - active
South           - 0.7.3        - active
virtualenv      - 1.6.1        - active
yolk            - 0.4.1        - active

Django和Gevent之间是否存在兼容性问题?我在这里做错了什么吗?

顺便说一下,我正在使用来自非官方Python存储库的预构建Windows二进制文件,这是一个开发环境。


你确定你没有使用mod_wsgi吗? - Ignacio Vazquez-Abrams
不,我正在使用默认的Django开发服务器,并使用runserver命令。 - Mridang Agarwalla
错误消息中提到的路径暗示Python正在运行Mac OS X上?此外,如果您不打补丁线程(即monkey.patch_all(thread=False)),错误是否会消失? - Simon
嗨Simon,我的错。那个错误信息是我从另一个SO帖子复制并放在了剪贴板上的。看起来完全一样,但路径来自另一个平台。我已经放置了正确的异常消息。对此很抱歉。 - Mridang Agarwalla
如果我添加 thread=False 参数,我会得到以下错误 — NotImplementedError: gevent 仅可从单个线程中使用 - Mridang Agarwalla
我看到了相同的 KeyError 异常,但是在 OS X 上出现。我认为这可能不仅限于 Windows。 - Justin Poliey
1个回答

2

昨天已经修复了与patch_item相关的猴子模块中的一个错误。建议使用修复后的版本进行进一步测试。

如果这没有帮助,您可以通过调用patch_all并将某些参数设置为False来缩小问题范围,并找出哪个模块对您有问题。

def patch_all(socket=True, dns=True, time=True, select=True, thread=True, os=True, ssl=True, httplib=False, aggressive=True)

我建议首先测试的是 monkey.patch_all(socket=False, select=False)。这将使 "dns" 和 "aggressive" 也未被使用。然后您可以分别集中精力于 socket 和 select,最后,如果其他所有内容都可以安全启用,可以尝试 "dns" 和 "aggressive"。


1
@MridangAgarwalla:我最近看到的有希望的修复在1.0系列中 https://bitbucket.org/denis/gevent/ 。同一天发布了0.13.7,但是0.13系列的变更集看起来不那么有希望。我读了一篇关于gevent + django的博客。类似的讨论中出现的问题通过升级已经得到了解决。如果你的问题不同,是否容易重现? - hynekcer
@JustinPoliey:恐怕要满足您的需求需要您的反馈。Django可以与gevent一起使用。例如,这篇博客http://codysoyland.com/2011/feb/6/evented-django-part-one-socketio-and-gevent/。您能具体说明吗?时间不多了。 - hynekcer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接