Python Google App Engine后端/模块实例中的实际并发性

Python Google App Engine后端/模块实例中的实际并发性,python,google-app-engine,python-multithreading,concurrent-programming,Python,Google App Engine,Python Multithreading,Concurrent Programming,Google App Engine提供任务队列和后端(现在是模块)等服务,以并行处理请求和执行“并行工作”。典型的扇入扇出/分叉连接技术可以很容易地通过管道API、Fantasm等实现 在配置后端/模块的硬件时,您可以在B1、B2、B4、B8之间进行选择,但它没有说明CPU配置中的内核数量。也许CPU核的数量与此无关。后端支持为每个传入的请求生成“后台线程”,但由于著名的GIL(全局解释器锁),Python实际上无法执行真正的并发工作 在启动新实例之前,一个前端实例将处理8个请求(默认,最多30

Google App Engine提供任务队列和后端(现在是模块)等服务,以并行处理请求和执行“并行工作”。典型的扇入扇出/分叉连接技术可以很容易地通过管道API、Fantasm等实现

在配置后端/模块的硬件时,您可以在B1、B2、B4、B8之间进行选择,但它没有说明CPU配置中的内核数量。也许CPU核的数量与此无关。后端支持为每个传入的请求生成“后台线程”,但由于著名的GIL(全局解释器锁),Python实际上无法执行真正的并发工作

在启动新实例之前,一个前端实例将处理8个请求(默认,最多30个)

据说,带有Threadsafe指令的Python 2.7在一个独立实例上并行处理传入请求,这是正确的,还是只有传入请求分布在独立实例上,并以真正的并发方式完成

在GoogleAppEngine上,真正的并发在技术上是如何执行的,而在另一方面,获得最多实际并发性和可伸缩性的推荐设计模式是什么

您可以使用10-20个驻留B8实例创建一个“手动缩放”后端/模块,每个实例生成10个“过期”后台线程,并始终执行10个并发异步URL抓取以进行I/O工作,还是应该通过动态实例创建将其展开

据说,带有Threadsafe指令的Python2.7在一个独立实例上并行处理传入请求,对吗

它实际上会在每个实例上同时运行多个请求,而不是将它们分散在多个实例上。(但是)。这通常被认为是允许这样做的最佳实践,因为它大大提高了大多数工作负载的效率

有我见过的关于GAE如何决定是否和何时并发运行请求的最佳细节


您是对的,Python有一个GIL,它在一定程度上限制了内核之间的并发性,对于真正受CPU限制的工作负载,每个内核有多个线程对您没有多大帮助。然而,绝大多数工作负载都不受CPU限制,尤其是GAE等平台上的Web应用程序。相反,它们通常是I/O绑定的,也就是说,它们将大部分时间花在等待数据存储、HTTP回迁到其他服务等上。App Engine使用阻塞的时间在同一实例上高效地运行其他并发请求。

如果使用所有api的异步版本,则可以在python中执行并发处理。大多数请求最终都会使用大量无效的api,因此存在大量并发机会,但是如果您只是执行CPU限制的任务,那么从单个后端或前端获得的并发性将非常小。您采取的具体方法将在很大程度上取决于您的处理需求,您需要分析以更好地理解最合适的选择。结合使用所有可用异步版本的应用程序引擎API的多个实例和代码,将在传入请求之间提供最佳的实际并发性。@TimHoffman,仅供参考,异步和同步API之间的区别主要在于用户区。应用程序引擎的请求调度程序不关心您使用哪一个。如果当前请求在API调用上被阻止,无论它们使用的是同步API还是异步API,调度程序都会在该实例上愉快地运行新请求。