Multithreading Go如何在Google App Engine上处理并发请求

Multithreading Go如何在Google App Engine上处理并发请求,multithreading,google-app-engine,go,Multithreading,Google App Engine,Go,我对Go如何在Google App Engine上处理并发请求有点困惑。所以我希望有人能澄清一下 以下是我收集的事实: Go是应用程序引擎上的单线程。- 如果Go在AppEngine上是单线程的,那么第3点是没有意义的。剩下1和2。如果Go-on应用程序引擎是单线程的,并且需要线程在阻止I/O时继续执行,那么似乎应用程序引擎Go实例将在等待I/O时阻止所有goroutine 这是正确的吗?如果没有,Go的并发性在AppEngine上究竟是如何工作的 帮助量化事物。如果我将连接保持打开状态30

我对Go如何在Google App Engine上处理并发请求有点困惑。所以我希望有人能澄清一下

以下是我收集的事实:

  • Go是应用程序引擎上的单线程。-

  • 如果Go在AppEngine上是单线程的,那么第3点是没有意义的。剩下1和2。如果Go-on应用程序引擎是单线程的,并且需要线程在阻止I/O时继续执行,那么似乎应用程序引擎Go实例将在等待I/O时阻止所有goroutine

    这是正确的吗?如果没有,Go的并发性在AppEngine上究竟是如何工作的

    帮助量化事物。如果我将连接保持打开状态30秒。单个AE Go实例如何维护并发连接

    多谢各位

    编辑:这是允许Go实例运行的功能请求 处理超过10个并发请求。 请给它加星星


    我必须承认我对阿彭金一无所知。这都是猜测和猜测,但我认为这有点合理

    你的应用程序永远不会达到10个线程的限制。这是因为创建线程的原因很少。首先,一次运行的goroutine的最大数量设置为1到1。其次,与普通的go程序不同,AppEngine实际上不需要进行系统调用。它唯一能做的就是联网。appengine中的所有IO都可以混合到一个epoll线程中。这意味着您只需要在任何给定时间有两个线程。然后,您可以添加第三个或第四个线程,以防偶尔需要运行其他系统调用,例如分配内存和接受/关闭连接。这些是快速的系统调用,只占用很短的时间。即使使用这些其他系统调用,您仍然离十个线程的限制很远


    并发性不会受到影响,因为最终,您在appengine中所做的一切都归结为等待网络上的某些东西返回。您不需要多个线程同时执行许多操作。

    一个Go应用程序引擎实例允许10个并发请求,但只运行一个CPU线程。实际上,可以同时处理多个请求,但一次只能处理一个请求。例如,如果一个请求正在等待数据存储API调用返回,那么另一个请求可以由同一实例自由处理


    您的陈述“如果Go在App Engine上是单线程的,那么第3点是没有意义的。”是不正确的。对于单个Go应用程序引擎实例,仍有10个并发飞行中请求的限制。当文档中提到“线程”时,文字有点松散。

    我在寻找答案,偶然发现了这个问题/答案,但最终也找到了更多关于这个问题的官方文档。根据一个示例,可以显式地配置此功能

    从该职位:

    这将应用程序的每个实例配置为同时提供多达100个请求(默认为10个)。您可以将Go实例配置为最多支持500个并发请求


    设置GOMAXPROCS=1(GAE就是这么做的)只意味着始终只有一个活动线程执行goroutines。您可能仍然有几个被阻止的线程(它们不算在内)。还要注意的是,Go库在后台使用epoll,因此I/O不太可能阻止整个线程(但是还有其他几种方法可以阻止Go中的线程)。不过,我对GAE上的一般10线程限制一无所知。现在可以配置并发请求限制(最多80个),请参见“谢谢Stephen”,这非常有帮助。@KyleFinley,如果您对“epoll”内容不太熟悉,我强烈建议您至少浏览一下经典作品。@kostix有趣的文章。谢谢。这个答案需要更多的传播。我知道Go运行时会对请求进行排队,因此传入的请求必须等到当前请求得到完全处理。很明显,一个请求可以产生许多go例程并同时运行,但并不是很多go例程都可以。文档确实说“一个给定的实例可以同时处理多个请求”,但直到我刚才重读这一段之前,我从未读过那么多,已经停止单线程限制。谢谢David。我仍然有点不清楚节流请求。我的意思是,所有实例都受到10个并发线程的限制,而不是请求。这似乎最近有所改变。对围棋来说不是这样吗?如果它确实是线程,那么F1 Go实例可以处理的并发请求数量的实际限制是多少?我不能说Python和Java,但Go并没有在App Engine上运行多线程。每个Go应用程序实例只有一个线程,但最多可以处理10个并发请求。至于F1实例可以处理什么,这在很大程度上取决于工作负载。如果所有的请求都是从数据存储中取出一些东西,嚼一嚼然后吐出来,那么它没有理由不能处理10个以上的并发请求。@dsymonds关于你的最后一句话(用数据存储绑定的工作负载处理10个以上的并发请求)——这正是我所想的。。。那么,将每个实例限制为仅10个请求的理由是什么?我想取消这个限制?我刚刚开始一个项目,我希望这会给我带来很大的不同。