我编写了一个基于Web的python资产管理系统来管理短cg动画的制作。我正在使用Python2.7,SQLAlchemy和SQLite,以及CherryPy。
它目前正在生产中使用,并且大多数情况下都能正常工作。系统将生产数据保存在中央服务器上,并允许用户“检出”资产到本地计算机。它通过在客户端机器上运行一个小的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 :(得分:0)
如this pull request所述,您可能会受到CherryPy RamSession
实施中的竞争条件的影响。
虽然补丁可能不会自动应用,具体取决于您使用的CherryPy版本,但这部分代码似乎暂时没有更改,因此您可以手动修补它。 / p>