3

我编写了一个基于 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'

例如,当用户签出资产时,他们会通过引导模式显示加载栏。如果出现这个会话错误,它显然会无限期挂起。但是当用户重新加载页面时,他们会看到资产已签出并且所有内容都已正确处理。所以我假设这个错误发生在请求结束时,在一切都被正确处理之后。

4

1 回答 1

0

您可能会受到 CherryPyRamSession实现中的竞争条件的影响,如此拉取请求中所述。

尽管根据您使用的 CherryPy 版本,该补丁可能不会自动适用,但这部分代码似乎有一段时间没有更改,因此您可以手动修补它。

于 2014-05-21T01:39:01.570 回答