为什么Google App Engine仅支持单个执行线程?

Chr*_*unt 11 concurrency google-app-engine multithreading

有没有人知道为什么Google App Engine只允许部署应用程序的单个执行线程?

我个人认为它与应用程序的可预测性有关,因此Google可以更可靠地调整其性能.Google网站上似乎没有关于单线程执行的任何理由,因此我的问题.

拥有一个已经是多线程且当前部署在VM上的应用程序意味着在我受到此限制的情况下我很难迁移到云端.

编辑:我已经在下面标出了答案,因为由于水平缩放要求,不允许线程听起来很合理.自然地,线程都在同一个进程空间内执行,并且由于GAE可以为您的应用程序运行许多进程,因此很难共享线程.也就是说,我仍然认为每个进程的一个小线程池是有用的,可能有助于将应用程序迁移到云.我将要求将此作为一项功能.谢谢你的讨论!

Ash*_*eyS 11

在谷歌应用引擎中产生称为任务队列的线程的替代方法有限:http://code.google.com/appengine/docs/python/taskqueue/

编辑

来自http://code.google.com/appengine/docs/java/runtime.html#The_Sandbox:

为了允许App Engine跨多个Web服务器分发应用程序请求,并防止一个应用程序干扰另一个应用程序,该应用程序在受限制的"沙箱"环境中运行.在此环境中,应用程序可以在App Engine数据存储区中执行代码,存储和查询数据,使用App Engine邮件,URL提取和用户服务,并检查用户的Web请求并准备响应.

正如其他人所指出的那样,对于沙箱应用程序的证券理由不支持线程.

Google App Engine中还有许多其他限制,迫使开发人员创建可扩展的应用程序.我相信任务队列只是这些限制中的另一个,因为与在处理HTTP请求的当前机器上创建线程相反,任务被放入队列中,然后可以由其他机器调度和执行.任务队列允许以可伸缩的方式在机器之间共享和分布工作.

  • 创建线程到底与安全性有什么关系?唯一的安全方面是通过产生太多线程来杀死服务器。所有其他安全参数都是无效的,我在一个线程中可以做的任何事情我在另一个线程中也可以做得同样好。当然,我谈论的是简单的任务,而不是 SETI。 (2认同)

Nic*_*son 6

App Engine使用基于请求的执行模型 - 也就是说,所有工作都限定为请求,无论是面向用户还是由另一个系统(如任务队列)启动的请求.虽然可以在此环境中使用线程,但多线程有用的大多数用例涉及长时间运行的进程,App Engine不适用于此工作,或者离线工作,在这种情况下,您最好使用使用App Engine提供的可扩展工具,例如任务队列.

换句话说,线程是一般问题的特定解决方案.App Engine以任务队列的形式为大多数用例提供了替代方案.