7

官方 appengine 文档说,如果我们在 app.yaml 中将 threadsafe 属性设置为 true,那么 appengine 将处理并发请求。

官方链接: https ://developers.google.com/appengine/docs/python/python27/newin27#Concurrent_Requests

  • 如果我们将线程安全属性设置为 true,这是否意味着应用程序将更快(比 2.5)?官方文档/博客这么说,但我正在寻找真实世界的经验。

  • 在高层次上,它在内部是如何工作的?我们的应用程序会被初始化并为每个请求生成一个新的 theread 吗?

4

4 回答 4

11

每个请求您仍然只有一个线程 - 您无法生成。

关闭线程安全后,Appengine 只会将一个请求路由到一个实例。因此,如果每秒请求数乘以处理请求的时间接近 1,Appengine 将启动一个新实例来处理它们。这要花钱。启用线程安全后,Appengine 可以将多个请求路由到一个实例。

这是否对您有帮助取决于您的应用程序和您的流量:

  1. 首先,计算每秒入站请求/平均延迟。如果这远低于 1,那么无论哪种方式,线程安全都不会产生太大影响。
  2. 检查您的应用程序以了解它在等待 API(例如数据存储或 URL 获取)上花费了多少时间。如果这是一个很大的比例,那么线程安全将有助于让您的实例倒计时。如果没有,它不会有太大帮助。

简单的规则是打开线程安全,除非您的应用程序非常需要处理(很少有 API 等待)。

于 2012-06-12T23:12:10.723 回答
4
  1. 这并不意味着您的应用程序会变得更快,请求仍然由单个线程提供服务。
  2. 当应用程序是线程安全的时,每个实例现在可以产生多个线程,每个线程将服务于一个请求,与非线程安全的情况相反,其中每个实例都有一个线程服务请求。
于 2012-06-11T09:20:04.420 回答
3

在每个请求的基础上,Python 2.5 仍然比 Python 2.7 快一点。这部分是由于每个人的成熟程度。App Engine 使用不同的机制来支持它们中的每一个。Python 2.7 的优势在于它能够支持并行请求,而不是以 Python 2.5 处理负载峰值所需的速度启动新实例。

“它是如何在内部工作的”这个问题你可能不会在这里得到答案,但在过去一年的 Google I/O 上,有一些谈话暗示了我们做什么以及为什么。在 youtube.com 上搜索“应用引擎”。

于 2012-06-13T04:29:10.413 回答
0

我在这里添加一个答案,因为我们当前的实际结果与我们的预期相反。

在持续的性能下降之后,我们尝试将我们的(Python)应用程序切换回非线程安全模式,并且非常惊讶地看到我们的性能提高了大约 10 倍。所以我们把它关掉了。我们的 GAE 支持团队无法解释这是怎么回事。上次我们进行分析时,我们的 I/O 与数据存储非常相关,理论上应该仍然可以从多线程中获得很多提升。

所以根据我们的经验......不仅不要假设线程安全会更快,它可能会慢得多。如果有人知道这是怎么回事,请分享。

于 2017-08-23T21:46:24.830 回答