2011-09-01 3 views
5

私は最近python2.7とdjango1.3にアップグレードし、その後Djangoの例外は、デバッグする方法がわからない、それ

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 

ので、あなたの助けをいただければ幸いです。

+0

どのバージョンをアップグレードしましたか?また、エラーはいつ発生しますか? – d0ugal

+0

Django 1.1.2とpython 2.6 – ApPeL

+0

あなたは新鮮なvirtualenvを使用しますか、それともアップグレード前と同じですか? – yedpodtrzitko

答えて

1

通常、最初の推奨事項は、geventやgreenletに最新のアップデートを適用するか、スレッドに関連するものを適用することです。 threading.Thread.startの実装がPython 2.6と2.7の間で変更されました。 Djangoを使って緑色にする方法や緑色にする方法がたくさんあります。最近のPython 2.7を読んでみてください。問題を引き起こすリンクを送信します。

デバッグ: はstderrになどを開始したスレッドのログを有効にするために、あなたのmanage.pyに次の行を追加します

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

は、スレッドが獲得何も参照するために、引数にverbosedjango/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 

これは自動リロードと同じです。モデルは子プロセスによって検証されます。 "Dummy-1"はスレッドのシンボリック名です。これは、より多くのスレッドに対して繰り返すことができますが、前のスレッドによって解放されるまで、スレッドはロックを取得する必要はありません。私たちは結果に従って続けることができます。

関連する問題