0

这是一个高级问题,但看起来很简单 - 请参阅代码(一个全局变量,每个 http 处理程序调用都会增加一个变量)。

some_global_var = 0

class DebugCgiHandler(webapp.RequestHandler):
  def get(self):
    some_global_var++
    self.response.out.write(some_global_var)

Q1。问题是如果变量设置为 1 并且并发调用发生在另一个请求中,那么在 Python 2.5 和 Python 2.7 单线程模式下会发生什么,因此变量将在第二个请求之前递增self.response.out.write(some_global_var)。第一个请求中将显示什么,第二个请求中将显示什么?


Q2。第二个问题是,如果 Python 2.7 以多线程模式运行,在同样的情况下会发生什么?


Q3。如何在整个请求处理过程中避免变量更改以保持相同的值直到最后免受其他线程的影响?

4

1 回答 1

4

Q1:在单线程模式下你不会有并发请求调用进来,所以你不必担心线程安全。

Q2:启用多线程后,您可能会遇到不可预知的行为,因为不同的线程可能会增加 some_global_var 并在不同的时间显示它们。例如,如果时间以特定方式发生, some_global_var 可能只会增加一次。

Q3:使用 threading.Lock()

现在我还没有回答你会得到什么结果,因为对于 App Engine,这个问题已经被打破了。some_global_var 在特定实例中将是“全局的”,但您无法控制您的请求转到哪些实例。因此,即使在单线程环境中,您的两个请求也可能会遇到两个单独的实例,在这种情况下,您会看到两个请求都为 1。或者他们可能会遇到同一个实例,您会看到 2。您的线程问题将在此基础上应用。

于 2013-02-28T00:23:05.700 回答