Исключение Django меня беспокоит, не знаю, как его отладить - PullRequest
5 голосов
/ 01 сентября 2011

Я недавно обновился до python2.7 и django1.3 и с тех пор

Unhandled exception in thread started by <bound method Command.inner_run of <django.core.management.commands.runserver.Command object at 0x109c57490>>
Traceback (most recent call last):
    File "/Users/ApPeL/.virtualenvs/myhunt/lib/python2.7/site-packages/django/core/management/commands/runserver.py", line 88, in inner_run
        self.validate(display_num_errors=True)
    File "/Users/ApPeL/.virtualenvs/myhunt/lib/python2.7/site-packages/django/core/management/base.py", line 249, in validate
        num_errors = get_validation_errors(s, app)
    File "/Users/ApPeL/.virtualenvs/myhunt/lib/python2.7/site-packages/django/core/management/validation.py", line 36, in get_validation_errors
        for (app_name, error) in get_app_errors().items():
    File "/Users/ApPeL/.virtualenvs/myhunt/lib/python2.7/site-packages/django/db/models/loading.py", line 146, in get_app_errors
        self._populate()
    File "/Users/ApPeL/.virtualenvs/myhunt/lib/python2.7/site-packages/django/db/models/loading.py", line 67, in _populate
        self.write_lock.release()
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 137, in release
        raise RuntimeError("cannot release un-acquired lock")
    RuntimeError: cannot release un-acquired lock

Ваша помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 19 апреля 2012

Обычная первая рекомендация - применять последние обновления к gevent или greenlet или к тому, что вы используете, связанным с потоками. Реализация threading.Thread.start была изменена между Python 2.6 и 2.7. Есть много рецептов, как начать зеленый ... или зеленый ... с Джанго. Попробуйте прочитать любой недавний для Python 2.7. и отправьте ссылку, из-за которой возникает проблема.

Debugging: Добавьте следующие строки в manage.py, чтобы включить ведение журнала запуска потока и т. Д. В stderr:

import threading
setattr(threading, '__debug__', True)

Добавьте аргумент verbose в django/db/loading.py строку 39, чтобы увидеть также, какие потоки получают и снимают блокировку.

-        write_lock = threading.RLock(),
+        write_lock = threading.RLock(verbose=True),

Запустить сервер разработки. Только для одного потока без автозагрузки вы должны увидеть что-то вроде:

$ python manage.py runserver --noreload
Validating models...

MainThread: <_RLock owner='MainThread' count=1>.acquire(1): initial success
MainThread: <_RLock owner=None count=0>.release(): final release

Примечания:
count=1 acquire(1) - первый захват блокирующим замком
owner=None count=0>.release() - замок в данный момент разблокирован

$ python manage.py runserver
Validating models...

Dummy-1: <_RLock owner=-1222960272 count=1>.acquire(1): initial success
Dummy-1: <_RLock owner=None count=0>.release(): final release

То же самое и с автозагрузкой. Модели проверяются дочерним процессом. «Пустышка-1» - это символическое название темы. Это может быть повторено для большего количества потоков, но никакие потоки не должны / не могут получить блокировку, пока она не будет снята предыдущим потоком. Мы можем продолжить в соответствии с результатами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...