gpt4 book ai didi

python - CherryPy、线程和成员变量;潜在问题?

转载 作者:行者123 更新时间:2023-11-28 23:00:13 26 4
gpt4 key购买 nike

假设我有以下简单类:

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)

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

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

我不完全理解 CherryPy 的线程是如何工作的,我想我在这个简单的例子中关心的是,在一个线程上,test_member 可能等于一件事,而当从另一个线程访问时,它完全是一件事不同的。如果我遗漏了一些有据可查的内容,我会提前道歉,但谷歌搜索并没有真正找到我想要的东西。我知道对于这样一个简单的例子,有许多相对简单的路径可以解决这里的潜在问题(将变量的状态保存在数据库中,或者类似的东西),但这在我的实际用例中不起作用.

最佳答案

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

CherryPy 中的共享访问通常与任何其他 Python 程序没有什么不同。与其在这里长篇大论地重复所有这些选项,不如将您定向到 http://effbot.org/zone/thread-synchronization.htm。正如它所提到的,替换实例变量对于 GIL 而言可能是原子的,因此是线程安全的,但递增不是。

CherryPy 只会在相反的方向添加一些帮助程序:当您不想想要共享时:cherrypy.requestcherrypy.response 为每个请求/响应新创建(并正确销毁)对象——如果您只想在请求期间保留数据,请随意将数据粘贴到 cherrypy.request.foo 中。

关于python - CherryPy、线程和成员变量;潜在问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12343788/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com