【问题标题】:Concurrent requests in Appengine PythonAppengine Python 中的并发请求
【发布时间】:2012-06-14 04:23:57
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python performance google-app-engine concurrency python-2.7


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      每个请求仍然只有一个线程 - 你不能生成。

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

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

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

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

      【讨论】:

      • 很好的回答!一个问题,我觉得 req/ms x ms/req ~= 活动实例数。是否有任何参考资料描述了此估算的更多细节?
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:
        1. 这并不意味着您的应用程序会变得更快,请求仍然由单线程处理。
        2. 当应用程序是线程安全的时,每个实例现在可以产生多个线程,每个线程将处理一个请求,而非线程安全的每个实例都有一个线程处理请求。

        【讨论】:

        • 我的应用程序是线程安全的(没有共享状态),我应该生成多个线程来提高性能吗?有没有可用于 appengine 的示例?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-19
        • 1970-01-01
        • 1970-01-01
        • 2010-12-08
        • 2012-04-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多