2013-04-29 52 views
3

我已經寫了一個基於web的資產管理系統來管理短cg動畫的製作。我使用Python2.7,SQLAlchemy和SQLite以及CherryPy。Cherrypy會議發佈KeyError

它目前正在生產中使用,大部分工作正常。該系統將生產數據保存在中央服務器上,並允許用戶將資產「檢出」到本地機器上。它通過在客戶端機器上運行一個小型的python服務來實現這一點,服務器通過XMLRPC進行通信。我遇到的問題出現在用戶檢查資產進出或發佈資產時;所有這些都是需要幾分鐘才能完成的請求,因爲大文件,儘管大部分時間他們需要10秒鐘。

問題是CherryPy在請求結束時嘗試釋放會話時引發KeyError。以下是回溯:

[29/Apr/2013:15:39:02] Traceback (most recent call last): 
    File "/home/i7858384/local/lib/python2.7/site-packages/CherryPy-3.2.2-py2.7.egg/cherrypy/_cprequest.py", line 102, in run 
    hook() 
    File "/home/i7858384/local/lib/python2.7/site-packages/CherryPy-3.2.2-py2.7.egg/cherrypy/_cprequest.py", line 62, in __call__ 
    return self.callback(**self.kwargs) 
    File "/home/i7858384/local/lib/python2.7/site-packages/CherryPy-3.2.2-py2.7.egg/cherrypy/lib/sessions.py", line 698, in save 
    cherrypy.session.save() 
    File "/home/i7858384/local/lib/python2.7/site-packages/CherryPy-3.2.2-py2.7.egg/cherrypy/lib/sessions.py", line 230, in save 
    self.release_lock() 
    File "/home/i7858384/local/lib/python2.7/site-packages/CherryPy-3.2.2-py2.7.egg/cherrypy/lib/sessions.py", line 374, in release_lock 
    self.locks[self.id].release() 
KeyError: u'6f23f62a29d3db4ad18c89165d23c1b7170570b8' 

[29/Apr/2013:15:39:02] HTTP 
Request Headers: 
    Content-Length: 2698301 
    HOST: 172.16.76.31:8080 
    Remote-Addr: 172.16.76.164 
    ACCEPT: */* 
    USER-AGENT: python-requests/0.14.2 CPython/2.6.6 Linux/2.6.32-279.5.2.el6.x86_64 
    Content-Type: application/x-www-form-urlencoded 
    ACCEPT-ENCODING: gzip, deflate, compress 
[29/Apr/2013:15:39:02] HTTP Traceback (most recent call last): 
    File "/home/i7858384/local/lib/python2.7/site-packages/CherryPy-3.2.2-py2.7.egg/cherrypy/_cprequest.py", line 660, in respond 
    self.hooks.run('before_finalize') 
    File "/home/i7858384/local/lib/python2.7/site-packages/CherryPy-3.2.2-py2.7.egg/cherrypy/_cprequest.py", line 112, in run 
    raise exc 
KeyError: u'6f23f62a29d3db4ad18c89165d23c1b7170570b8' 

例如,當用戶檢查資產時,他們通過引導模式顯示加載欄。如果發生此會話錯誤,它顯然會無限期地掛起。但是,當用戶重新加載頁面時,他們會看到資產已經簽出並且所有內容都正確處理。所以我假設這個錯誤發生在請求結束後,正確處理了所有內容。

+0

您是否正在使用'-O'' python -O'或'python -OO',或者直接使用session的方法,比如'cherrypy.session.save()'?,RamSession,對吧? – cyraxjoe 2013-05-03 01:29:23

+0

可能與[此問題](http://stackoverflow.com/q/12703347/372643)有關。我意識到這個問題在很久以前就被問到了,但是你是在一個單獨的過程中運行這個應用程序,還是你正在使用一個前端(例如,帶有'mod_python',WSGI,FastCGI ......的Apache)多個進程? – Bruno 2014-05-20 21:16:46

回答

0

您可能正在受CherryPy的RamSession實施中的競態條件影響,如this pull request中所述。

雖然該補丁可能不會自動適用,具體取決於您使用的CherryPy版本,但這部分代碼似乎並未發生一段時間的變化,因此您可能可以手動補丁。