Python 应用程序引擎调度程序何时使用新线程与新实例?

Python 应用程序引擎调度程序何时使用新线程与新实例?,python,google-app-engine,Python,Google App Engine,如果我在我的app.yaml文件中设置了threadsafe:true,那么什么规则控制何时创建新实例来服务请求,以及何时在现有实例上创建新线程 如果我有一个应用程序,它可以在每个请求上执行计算密集型操作,那么多线程是否能为我带来任何好处?换句话说,实例是多核实例还是单核实例 或者,新线程是否只有在现有线程等待IO时才会启动?阅读Kyle Finley建议的下一条消息 杰夫·施尼策:仍然有10个线程的硬限制吗 是的,但可能不是因为你期望的原因。我们面临的首要问题是 遇到的是内存管理。如果我们把默

如果我在我的
app.yaml
文件中设置了
threadsafe:true
,那么什么规则控制何时创建新实例来服务请求,以及何时在现有实例上创建新线程

如果我有一个应用程序,它可以在每个请求上执行计算密集型操作,那么多线程是否能为我带来任何好处?换句话说,实例是多核实例还是单核实例


或者,新线程是否只有在现有线程等待IO时才会启动?

阅读Kyle Finley建议的下一条消息

杰夫·施尼策:仍然有10个线程的硬限制吗

是的,但可能不是因为你期望的原因。我们面临的首要问题是 遇到的是内存管理。如果我们把默认值提高到100,很多人 应用程序将看到内存不足的死亡(比现在更多),并且 对于python/java/go来说,这些死亡表现得不同。正确的道路 forward是更智能的算法wrt内存,提供 可配置性,等等。这是一个例子的种类 我们为调度程序工作的项目,但与我们拥有的任何团队一样 确定我们项目的优先顺序。我建议将此文件(或任何其他文件)归档 所需的调度程序增强功能),以便 可以获得反馈/数据/投票

如果我在我的app.yaml文件中设置threadsafe:true,那么控制何时创建新实例来服务请求,以及何时在现有实例上创建新线程的规则是什么

正如人们在这里所说的,如果以前的实例已经使用了10个线程,那么将启动一个具有新线程的新实例。如果所有其他线程都很忙,则将创建一个新线程,它们必须等待响应或计算结果

如果我有一个应用程序,它可以在每个请求上执行计算密集型操作,那么多线程是否能为我带来任何好处?换句话说,实例是多核实例还是单核实例

现在这个问题很有争议。每个人都知道答案,但他们仍然持怀疑态度。如果你的任务仅仅基于计算,多线程永远也买不到任何好处,除非你使用的是多核处理器,不要问我为什么多核处理器会更好,你知道答案。现在google app engine还不够成熟,无法决定何时将新线程分派到另一个处理器/核心(如果存在),只将新实例分派到另一个核心/处理器。希望线程在另一个核心/处理器中运行?好吧,把一些技能扔到那里去,布雅!请记住,线程是否应该在其他内核/处理器中运行由您决定,引擎不能对此负责,因为这可能会导致很多混乱,引擎不是上帝。简言之,默认情况下,实例是单核的,引擎无法为您决定何时应该使用多核

或者,新线程是否只有在现有线程等待IO时才会启动

我回答的第一部分澄清了这一点。是的,它们只有在现有线程繁忙时才会启动,这就是threadsafe的工作方式,以防止死锁


现在我可以告诉大家,根据我的个人经验,我在应用程序引擎上工作了好几个月,编写/调试/测试了高度依赖于线程安全体系结构的应用程序。如果你愿意,我可以添加推荐信(我没有推荐信,只是个人经验,但我准备好为你搜索并把东西放在桌子上),但我认为在这种情况下不需要它们,threadsafe以我自己验证过的明显方式工作。

以下规则集当前用于确定给定实例是否可以接受新请求:

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)或
true
(Java)将不允许在单个实例上并行处理多个CPU绑定请求

如果未完全绑定CPU或未执行I/O,Python和Java运行时将生成新线程,用于处理新请求,最多10个并发请求,并使用
threadsafe:true

还要注意的是,尽管Go运行时是单线程的,但它确实支持并发请求:
它将为每个请求生成1个goroutine,并在goroutine执行I/O时在它们之间产生控制。

可能有助于回答您的第一个问题。Takashi表示AE实例被限制为10个并发线程,因此第11个线程似乎将启动一个新实例。+1用于在so上公开询问此问题,而不是通过电子邮件发送给同事。我认为这是答案的一部分,但它没有解决实例的多核/单核方面。对于任何有兴趣提高这个并发请求限制的人来说,它也根本不能解决一个实例在创建新实例之前是否需要有10个活动线程。这只适用于后端,对吗?对于前端实例,我看到在未触发上述任何规则时,新实例会加速运行。@KrisGiesing这也适用于前端,但生成新实例以处理新请求与等待队列的决定也取决于您的性能设置。@proppy感谢您的回答。如果新实例是基于CPU和内存的,为什么并发请求限制仍然存在?我认为N=10背后的基本原理是防止内存不足错误。N=10检查是否可以删除,或者还有其他原因吗?@KrisGiesing如果有关于这方面的功能请求,让我们将讨论转移到这里:@proppy我认为这个问题与我无关。我说的是: