我对Go如何处理Google App Engine上的并发请求感到有些困惑。所以我希望有人可以提供一些清晰度。
以下是我收集的事实:
Go是App Engine上的单线程。 - this is because it is possible to do arbitrary pointer arithmetic by creating race conditions with multiple threads
如果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。 请加星标。
答案 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个并发请求。