App Engine调度程序何时使用新线程与新实例?

如果我在我的app.yaml文件中设置了threadsafe: true ,那么在创build一个新的实例来提供请求时,与在现有的实例上创build一个新的线程的时候有什么规则?

如果我有一个应用程序在每个请求上执行一些计算密集型的任务,multithreading是否会为我购买任何东西? 换句话说,是多核实例还是单核?

或者,当现有的线程在IO上等待时,新的线程是否只能启动?

当前使用以下一组规则来确定给定的实例是否可以接受新的请求:

 if processing more than N concurrent requests (today N=10): false elif exceeding the soft memory limit: false elif exceeding the instance class CPU limit: false elif warming up: false else true 

以下总CPU /内核限制当前适用于每个实例类:

 CLASS 1: 600MHz 1 core CLASS 2: 1.2GHz 1 core CLASS 4: 2.4GHz 1 core CLASS 8: 4.8GHz 2 core 

因此,只有一个B8实例可以并行处理多达2个完全受CPU限制的请求。

对于类<8的实例,设置threadsafe: true (Python)或<threadsafe>true</threadsafe> (Java)不允许在单个实例上并行处理多个CPU绑定请求。

如果你没有完全被CPU绑定或者正在执行I / O操作,那么Python和Java运行时将产生新的线程来处理新的请求,最多10个带有threadsafe: true并发请求threadsafe: true

还要注意,即使Go运行时是单线程的,它也支持并发请求:它将在每个请求中产生1个goroutine,并在执行I / O时在goroutine之间产生控制权。

阅读凯尔·芬利(Kyle Finley)build议的链接的下一条消息

Jeff Schnitzer:还有10个线程的硬性限制吗?

是的,但可能不是你期望的原因。 我们遇到的主要问题是内存pipe理。 如果我们将默认值提高到100,那么许多应用程序就会看到内存不足的情况(比现在更多),这些死亡对于python / java / go来说显示方式不同。 正确的path是更智能的algorithm与内存,提供可configuration性等等。 这是我们为调度程序所做的各种项目的一个例子,但是与任何团队一样,我们必须优先考虑项目。 我build议在公共问题追踪器上提交这个(或任何其他所需的调度器增强function),以便他们获得反馈/数据/投票。

如果我在我的app.yaml文件中设置了threadsafe:true,那么在创build一个新的实例来提供请求时,与在现有的实例上创build一个新的线程的时候有什么规则?

就像人们在这里所说的,如果一个先前的实例已经使用了10个线程,那么将会启动一个带有新线程的新实例。 如果所有其他线程都忙,将创build一个新的线程,它们必须等待一些响应或计算结果。

如果我有一个应用程序在每个请求上执行一些计算密集型的任务,multithreading是否会为我购买任何东西? 换句话说,是多核实例还是单核?

现在这个问题是非常有争议的。 每个人都知道答案,但他们仍然怀疑。 如果你的任务是基于计算的话,multithreading永远不会给你带来任何好处,除非你使用的是多核处理器,不要问我为什么多核处理器会更好地帮助你,你知道答案。 现在谷歌应用程序引擎是不够复杂,以确定当新线程应该分派到其他处理器/内核(如果存在),只有新的实例分派到其他核心/处理器。 希望你的线程运行在其他核心/处理器? 那么,在那里抛出一些技巧和booya! 请记住,由您决定线程是否应该在其他内核/处理器上运行,引擎不能承担这样的责任,因为这可能导致如此之多的混乱,引擎不是上帝。 总之,默认情况下,实例是单核的,引擎不能为你决定什么时候应该去多核。

或者,当现有的线程在IO上等待时,新的线程是否只能启动?

我的答案的第一部分清除了这一点。 是的,只有当现有的线程繁忙时才会启动,这就是线程安全的工作原理,以防止死锁。

现在我可以告诉你这一切,从我个人的经验来看,我在app引擎上工作了很多个月,编程/debugging/testing的应用程序高度依赖线程安全体系结构。 如果你想要的话,我可以添加引用(我没有引用,只是个人的经验,但我已经准备好search,把东西放在桌子上),但是我不认为在这种情况下需要它们,线程安全我明显的方式工作,我已经validation了自己。