Python exception keyerror threading

Saved searches

Use saved searches to filter your results more quickly

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Exception KeyError in module ‘threading’ #362

Exception KeyError in module ‘threading’ #362

Comments

! /usr/bin/env python

— coding: latin-1 —

import gevent, gzip
from gevent import monkey; monkey.patch_all()

from bottle import route, run, debug, template, request, error, response, redirect, static_file
from urlparse import parse_qs

if name == ‘main‘:
basedatos = sys.argv[-1]
elhost = ‘192.168.43.129’
if os.getcwd()==’/var/www/lims’:
p=8000
run(server=’gevent’, port=p, host=elhost)
else:
p=8002
debug(True)

run(port=p, host=elhost, reloader=True)

I am on Ubuntu 12.04
Bottle versions 0.11.dev and 0.10.11

Читайте также:  Php количество всех пользователей

When I stop the program (in both folders):

^CException KeyError: KeyError(33551632,) in module ‘threading’ from ‘/usr/lib/python2.7/threading.pyc’ ignored

Exception in thread Thread-1:
Traceback (most recent call last):
File «/usr/lib/python2.7/threading.py», line 551, in __bootstrap_inner
self.run()
File «/usr/local/lib/python2.7/dist-packages/bottle.py», line 2743, in run
thread.interrupt_main()
KeyboardInterrupt

It doesn’t seem to do any harm, but I think you should know.

The text was updated successfully, but these errors were encountered:

Источник

Saved searches

Use saved searches to filter your results more quickly

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Exception KeyError: KeyError(28050128,) in ignored #1502

Exception KeyError: KeyError(28050128,) in ignored #1502

Comments

When I run ./digits-devserver on Ubuntu 12.04 I get following error:

 ./digits-devserver ___ ___ ___ ___ _____ ___ | \_ _/ __|_ _|_ _/ __| | |) | | (_ || | | | \__ \ |___/___\___|___| |_| |___/ 5.1-dev Traceback (most recent call last): File "/usr/lib/python2.7/runpy.py", line 162, in _run_module_as_main "__main__", fname, loader, pkg_name) File "/usr/lib/python2.7/runpy.py", line 72, in _run_code exec code in run_globals File "/home/myuser/Desktop/DIGITS/digits/__main__.py", line 70, in main() File "/home/myuser/Desktop/DIGITS/digits/__main__.py", line 55, in main import digits.webapp File "digits/webapp.py", line 47, in import digits.views # noqa File "digits/views.py", line 18, in from digits import dataset, extensions, model, utils, pretrained_model File "digits/extensions/__init__.py", line 4, in from .data import * # noqa File "digits/extensions/data/__init__.py", line 7, in from . import imageProcessing File "digits/extensions/data/imageProcessing/__init__.py", line 4, in from .data import DataIngestion File "digits/extensions/data/imageProcessing/data.py", line 12, in from .forms import DatasetForm File "digits/extensions/data/imageProcessing/forms.py", line 6, in from flask.ext.wtf import Form File "/usr/lib/python2.7/dist-packages/flask/exthook.py", line 62, in load_module __import__(realname) File "/usr/lib/python2.7/dist-packages/flaskext/wtf/__init__.py", line 72, in __all__ += fields.__all__ AttributeError: 'module' object has no attribute '__all__' Exception KeyError: KeyError(28050128,) in ignored 

What can be the source of this error and how can it be fixed?

So it’s ‘conflict’ of gevent and threading modules?

The text was updated successfully, but these errors were encountered:

Источник

KeyError в модуле threading после успешного запуска py.test

Я запускаю набор тестов с помощью py.test. Они проходят. Йиппи! Но я получаю это сообщение:

Exception KeyError: KeyError(4427427920,) in ignored 

Как мне найти источник этого? (Я не использую потоки напрямую, но использую gevent.)

3 ответы

Я заметил похожую проблему и решил посмотреть, что именно происходит — позвольте мне описать мои выводы. Надеюсь, кому-то это пригодится.

Короткий рассказ

Это действительно связано с исправлением обезьянами threading модуль. Фактически, я могу легко вызвать исключение, импортировав модуль потоковой передачи перед тем, как обезьяна исправляет потоки. Достаточно двух следующих строк:

import threading import gevent.monkey; gevent.monkey.patch_thread() 

При выполнении выдает сообщение об игнорировании KeyError :

(env)czajnik@autosan:~$ python test.py Exception KeyError: KeyError(139924387112272,) in ignored 

Если вы поменяете местами строки импорта, проблема исчезнет.

Длинная история

Я мог бы остановить отладку здесь, но решил, что стоит разобраться в точной причине проблемы.

Первым шагом было найти код, выводящий сообщение об игнорируемом исключении. Мне было немного сложно его найти (жду Exception.*ignored ничего не дало), но, исследуя исходный код CPython, я в конце концов нашел функцию с именем void PyErr_WriteUnraisable(PyObject *obj) in Python / error.c, с очень интересным комментарием:

/* Call when an exception has occurred but there is no way for Python to handle it. Examples: exception in __del__ or during GC. */ 

Я решил проверить, кто это звонит, с небольшой помощью gdb , просто чтобы получить следующую трассировку стека C-уровня:

#0 0x0000000000542c40 in PyErr_WriteUnraisable () #1 0x00000000004af2d3 in Py_Finalize () #2 0x00000000004aa72e in Py_Main () #3 0x00007ffff68e576d in __libc_start_main (main=0x41b980 , argc=2, ubp_av=0x7fffffffe5f8, init=, fini=, rtld_fini=, stack_end=0x7fffffffe5e8) at libc-start.c:226 #4 0x000000000041b9b1 in _start () 

Теперь мы ясно видим, что исключение генерируется, пока Py_Finalize выполняет — этот вызов отвечает за завершение работы интерпретатора Python, освобождение выделенной памяти и т. д. Он вызывается непосредственно перед выходом.

Следующим шагом было посмотреть на Py_Finalize() код (это в Python / pythonrun.c). Самый первый звонок, который он делает, wait_for_thread_shutdown() — стоит посмотреть, поскольку мы знаем, что проблема связана с потоками. Эта функция, в свою очередь, вызывает _shutdown вызываемый в threading модуль. Хорошо, теперь мы можем вернуться к коду Python.

Глядя на threading.py Я нашел следующие интересные детали:

class _MainThread(Thread): def _exitfunc(self): self._Thread__stop() t = _pickSomeNonDaemonThread() if t: if __debug__: self._note("%s: waiting for other threads", self) while t: t.join() t = _pickSomeNonDaemonThread() if __debug__: self._note("%s: exiting", self) self._Thread__delete() # Create the main thread object, # and make it available for the interpreter # (Py_Main) as threading._shutdown. _shutdown = _MainThread()._exitfunc 

Ясно, что ответственность threading._shutdown() вызов состоит в том, чтобы присоединиться ко всем потокам, не являющимся демонами, и удалить основной поток (что бы это ни значило). Я решил патчить threading.py немного — завернуть целиком _exitfunc() тело с try / except и распечатайте трассировку стека с помощью Выслеживать модуль. Это дало следующий след:

Traceback (most recent call last): File "/usr/lib/python2.7/threading.py", line 785, in _exitfunc self._Thread__delete() File "/usr/lib/python2.7/threading.py", line 639, in __delete del _active[_get_ident()] KeyError: 26805584 

Теперь мы знаем точное место, где возникает исключение — внутри Thread.__delete() метод.

Остальная часть рассказа очевидна после прочтения threading.py некоторое время. В _active словарь сопоставляет идентификаторы потоков (возвращенные _get_ident() ), Чтобы Thread экземпляров для всех созданных потоков. Когда threading модуль загружен, экземпляр _MainThread класс всегда создается и добавляется в _active (даже если другие потоки явно не созданы).

Проблема в том, что один из методов, пропатченных gevent исправление обезьян _get_ident() — исходный соответствует thread.get_ident() , monkey-patching заменяет его на green_thread.get_ident() . Очевидно, что оба вызова возвращают разные идентификаторы для основного потока.

Сейчас если threading модуль загружается до исправления обезьяны, _get_ident() вызов возвращает одно значение, когда _MainThread экземпляр создан и добавлен в _active , и другое значение в то время _exitfunc() называется — отсюда KeyError in del _active[_get_ident()] .

Напротив, если исправление обезьян сделано раньше threading загружается, все нормально — на время _MainThread экземпляр добавляется к _active , _get_ident() уже исправлен, и тот же идентификатор потока возвращается во время очистки. Вот и все!

Чтобы убедиться, что я импортирую модули в правильном порядке, я добавил в свой код следующий фрагмент непосредственно перед вызовом monkey-patching:

import sys if 'threading' in sys.modules: raise Exception('threading module loaded before patching!') import gevent.monkey; gevent.monkey.patch_thread() 

Надеюсь, моя история отладки окажется для вас полезной 🙂

Источник

Оцените статью