Исключения Gevent в Django при исправлении модулей Python

Я установил библиотеки gevent и greenlet и скопировал в __init__.py файл моего приложения Djano в следующих двух строках:

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? Я что-то здесь делаю не так?

К вашему сведению, я использую предварительно созданные двоичные файлы Windows из неофициального репозитория Python, и это среда разработки.


person Mridang Agarwalla    schedule 21.02.2012    source источник
comment
Вы уверены, что не используете mod_wsgi?   -  person Ignacio Vazquez-Abrams    schedule 21.02.2012
comment
Нет, я использую сервер разработки Django по умолчанию с командой runserver.   -  person Mridang Agarwalla    schedule 21.02.2012
comment
Путь, указанный в сообщении об ошибке, предполагает, что Python работает в Mac OS X? Кроме того, исчезнет ли ошибка, если вы не исправите потоки (например, monkey.patch_all(thread=False))?   -  person Simon    schedule 21.02.2012
comment
Привет, Саймон, мне плохо. Это сообщение об ошибке было из другого сообщения SO, которое я скопировал и находился в моем буфере обмена. он выглядит идентично, но пути были с другой платформы. Я разместил правильное сообщение об исключении. Прости за это.   -  person Mridang Agarwalla    schedule 21.02.2012
comment
Если я добавлю аргумент thread=False, я получу следующую ошибку - NotImplementedError: gevent is only usable from a single thread.   -  person Mridang Agarwalla    schedule 21.02.2012
comment
Я вижу то же KeyError исключение, но в OS X. Думаю, это не относится к Windows.   -  person Justin Poliey    schedule 11.04.2012


Ответы (1)


Вчера была исправлена ​​ошибка в модуле обезьяны, связанная с 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» и «агрессивный». Затем вы можете сосредоточиться на сокете и выбрать его отдельно и, наконец, если все остальное можно безопасно включить, на игру с «dns» и «агрессивным».

person hynekcer    schedule 13.04.2012