我现在已经搜索了一段时间,但无法找到答案。 我知道cherrypy创建了一个处理请求的新线程(GET,PUT,POST,DELETE等)。
现在我获取这样的参数:
...
@cherrypy.tools.json_in()
@cherrypy.tools.json_out()
def POST(self):
Forum.lock_post.acquire()
conn = self.io.psqlConnect(self.dict_psql)
cur = conn.cursor(cursor_factory = psycopg2.extras.RealDictCursor)
params = cherrypy.request.json
...
return some_dict
正如您所看到的,即可锁定线程以避免变量 params 上的竞争条件。但这真的有必要吗?我问这个问题是否像这样,POST上的所有其他请求都必须等待。没有锁定整个POST有没有更好的解决方案?我在代码中多次使用 params 。
答案 0 :(得分:2)
首先澄清一点,CherryPy没有为每个请求创建一个新线程,它有一个预定的线程池(默认为10个),实际上一个线程可以用来处理一个请求
至于你是否应该锁定cherrypy.request.json
。你真的没有,有一个名为"线程本地人"根据哪个线程正在访问此类对象,您可以在其上具有对不同对象的多个引用。 (python docs)。
说完了......你应该确保你编写的代码不会干扰其他线程的状态(你可以使用cherrypy.thread_data
作为快速修复)。
看一下cherrypy插件架构,如果你想在线程之间共享一个资源,通常一个插件可以:http://docs.cherrypy.org/en/latest/extend.html#plugins