2013-04-29 53 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版本,但这部分代码似乎并未发生一段时间的变化,因此您可能可以手动补丁。