如果我在threadsafe: true
文件中设置app.yaml
,那么在创建新实例以提供请求时的规则是什么,与在现有实例上创建新线程的时间相比?
如果我有一个应用程序在每个请求上执行计算密集型操作,那么多线程会给我带来什么吗?换句话说,实例是多核实例还是单核?
或者,当现有线程在IO上等待时,新线程是否只会启动?
答案 0 :(得分:36)
以下一组规则目前用于确定给定实例是否可以接受新请求:
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绑定的请求。
为实例类设置threadsafe: true
(Python)或<threadsafe>true</threadsafe>
(Java)&lt; 8不允许在单个实例上并行处理多个CPU绑定请求。
如果您没有完全受CPU限制或进行I / O操作,Python和Java运行时将生成新线程,以便使用threadsafe: true
另请注意,即使Go运行时是单线程的,它也支持并发请求: 它会在每次请求时产生1个goroutine,并在执行I / O时在goroutine之间进行控制。
答案 1 :(得分:1)
阅读Kyle Finley建议的link中的下一条消息
Jeff Schnitzer:还有10个线程的硬限制吗?
是的,但可能不是您期望的原因。我们的首要问题 遇到的是内存管理。如果我们将默认值提高到100,那么很多 应用程序会看到内存不足的死亡(比现在更多),以及 对于python / java / go,这些死亡的表现方式不同。正确的道路 转发是更智能的算法和内存,提供 可配置性等。这是各种各样的例子 我们为调度程序工作的项目,但与我们拥有的任何团队一样 优先考虑我们的项目。我建议提交此(或任何其他 公共问题跟踪器上的所需调度程序增强功能) 可以获得反馈/数据/投票。
答案 2 :(得分:0)
如果我在app.yaml文件中设置threadsafe:true,那么在创建新实例以提供请求时,与在现有实例上创建新线程时相比,有哪些规则可以管理?
就像人们在这里说的那样,如果前一个实例已经使用了10个线程,那么将启动一个带有新线程的新实例。如果所有其他线程都忙,则会创建一个新线程,它们必须等待某些响应或计算结果。
如果我有一个应用程序在每个请求上执行计算密集型操作,那么多线程会给我带来什么吗?换句话说,实例是多核实例还是单核?
现在这个问题很有争议。每个人都知道答案,但他们仍然持怀疑态度。如果您的任务仅基于计算,多线程永远不会给您带来任何好处,除非您使用多核处理器,不要问我为什么多核处理器会更好地帮助,您知道答案。现在谷歌应用程序引擎不够复杂,无法决定何时应将新线程分派到其他处理器/核心(如果存在),只会将新实例分派给其他核心/处理器。希望您的线程在其他核心/处理器中运行?那么,在那里扔一些技能和博雅!请记住,由您来决定线程是否应该在其他核心/处理器中运行,引擎不能承担这样的责任,因为这可能导致如此多的混淆,引擎不是上帝。简而言之,默认情况下,实例是单核,引擎无法决定何时应该进入多核。
或者,当现有线程在IO上等待时,新线程是否只会启动?
我的答案的第一部分清除了这一点。是的,它们只在现有线程忙时才会启动,这就是线程安全的工作方式,以防止死锁。
现在我可以告诉你这一切,根据我的个人经验,我在app引擎上工作了好几个月,编程/调试/测试的应用程序高度依赖于线程安全架构。如果你想我可以添加引用(我没有引用,只是个人经验,但我已经准备好为你搜索并把东西放在桌面上了),但我不认为在这种情况下需要它们,线程安全以明显的方式工作,我已经验证了自己。