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

时间:2012-07-12 07:05:48

标签: multithreading google-app-engine go

我对Go如何处理Google App Engine上的并发请求感到有些困惑。所以我希望有人可以提供一些清晰度。

以下是我收集的事实:

  1. Go是App Engine上的单线程。 - this is because it is possible to do arbitrary pointer arithmetic by creating race conditions with multiple threads

  2. Goroutines are multiplexed onto multiple OS threads so if one should block, such as while waiting for I/O, others continue to run.

  3. [App Engine has a] 10 concurrent limit [which] is enforced through a limit on concurrent threads on every runtime. Most of such cases, our scheduler will try to spin up a new instance.

  4. 如果Go是App Engine上的单线程,则第3点没有实际意义。这留下1和2.如果Go on App Engine是单线程的,并且线程需要在阻塞I / O时继续执行,那么似乎App Engine Go实例将在等待I / O时阻止所有goroutine。

    这是对的吗?如果不是,Go的并发性如何在App Engine上真正起作用?

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

    谢谢。

      

    编辑:这是允许Go实例的功能请求   处理超过10个并发请求Allow configurable limit of concurrent requests per instance。   请加星标。

3 个答案:

答案 0 :(得分:22)

Go App Engine实例允许10个并发请求,但只运行一个CPU线程。实际上,可以同时处理多个请求,但只有一个可以一次执行CPU工作。如果一个请求是等待数据存储区API调用返回,则同一个实例可以自由处理另一个请求。

你的陈述“如果Go是App Engine上的单线程,那么第3点就没有实际意义了。”是不正确的。对单个Go App Engine实例的空中请求仍有10个限制。当谈到“线程”时,文档有点松散。

答案 1 :(得分:4)

我必须承认我对AppEngine没有内幕知识。这都是猜测和猜测,但我认为这有点合理。

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

并发性不会受到影响,因为最终,您在appengine中所做的一切都归结为等待网络上的某些东西返回。你不需要多个线程一次做很多事情。

答案 2 :(得分:1)

我一直在寻找答案,并且偶然发现了这个问题,但最终还是找到了关于此事的更多官方文档。根据{{​​3}},可以对此进行显式配置。

从该帖子:

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