CherryPy,Threads和Member Variables;潜在的问题?

时间:2012-09-09 23:21:18

标签: python threadpool cherrypy

我们说我有以下简单的课程:

import cherrypy
import os

class test:
  test_member = 0;
  def __init__(self):
    return
  def index(self):
    self.test_member = self.test_member + 1
    return str(self.test_member)
  index.exposed = True

conf = os.path.join(os.path.dirname(__file__), 'config.ini')

if __name__ == '__main__':
  # CherryPy always starts with app.root when trying to map request URIs
  # to objects, so we need to mount a request handler root. A request
  # to '/' will be mapped to HelloWorld().index().
  cherrypy.config.update({'server.socket_host': '0.0.0.0'})
  cherrypy.quickstart(test(), config=conf)
else:
  # This branch is for the test suite; you can ignore it.
  cherrypy.config.update({'server.socket_host': '0.0.0.0'})
  cherrypy.tree.mount(test(), config=conf)

所以当我第一次打开我的索引页面时,下一次是2,然后是3,4,依此类推。我的问题是:

  • 这有什么大的危险吗,特别是线程和多人同时访问该页面?
  • 我是否必须在每次写入成员变量时以某种方式锁定成员变量以防止出现问题?
  • 如果我使用非基本数据类型作为成员(例如我自己的复杂类)而不是像整数那样简单的东西,有什么改变吗?

我不完全理解如何使用CherryPy进行线程化工作,我想我在这个简单示例中的关注点是,在一个线程上,test_member可能等于一个东西,并且当从另一个线程访问它时, d是完全不同的东西。如果我遗漏了一些记录良好的东西,我会事先道歉,但是一些谷歌搜索并没有真正找到我想要的东西。我理解这样一个简单的例子,有一些相对简单的路径可以解决这里的潜在问题(保持变量的状态在数据库中,或者沿着这些线路的东西),但这不会在我的实际工作中起作用用例。

1 个答案:

答案 0 :(得分:4)

存在丢失更新的危险。设置值不应该需要锁定,因为替换实例变量相对于GIL是原子的(假设它不调用任何特殊方法等)。但是增加或使用更复杂的变量将需要不同的方案来使它们成为线程安全的。

CherryPy中的共享访问通常与任何其他Python程序没有什么不同。而不是在这里对所有这些选项进行长时间的重复,最好指引你http://effbot.org/zone/thread-synchronization.htm正如它提到的那样,替换实例变量可能是相对于GIL的原子,因此是线程安全的,但增量不是。 / p>

CherryPy只在相反的方向添加一些帮助:当想要共享时:cherrypy.requestcherrypy.response对象是新创建的(并且被正确销毁)对于每个请求/响应 - 如果您希望仅在请求期间保留数据,请随时将数据粘贴到cherrypy.request.foo