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

时间:2010-09-27 00:28:57

标签: multithreading google-app-engine concurrency

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

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

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

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

6 个答案:

答案 0 :(得分:11)

在Google App Engine中生成称为任务队列的线程的替代方法有限: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   引擎邮件,URL提取和用户   服务,并检查用户的网络   请求并准备回复。

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

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:3)

我认为这是一个误导性的问题。 App Engine不允许您的应用程序生成线程,但应用程序引擎可能会启动应用程序的多个实例或使用某种线程或多进程请求处理程序。我不知道具体的细节,但如果没有某种并行性,应用程序引擎将是一个非常无用的平台。

修改

我的原始答案错误地暗示线程不是一个有用的功能,它们有很多用途,但大多数Web开发人员不管理其应用程序中的线程。线程通常在应用程序堆栈的较低级别进行管理。

答案 3 :(得分:2)

我不确定,但我相信这可能是出于安全原因。如果他们允许多个线程,他们就会打开fork()炸弹(或等效的线程)。此外,它极大地简化了资源管理--Google只需要管理每个应用程序的单个线程资源。

答案 4 :(得分:0)

自提出此问题以来推出的新功能是background threads

虽然在给定请求结束时连接常规线程(它们不能超过请求),但后台线程没有此限制。

  

后台主题

     

在手动或基本扩展实例上运行的代码可以启动后台线程,该后台线程可以比生成它的请求更长。这允许实例执行任意的定期或计划任务,或者在请求返回给用户后继续在后台工作。

示例代码:

from google.appengine.api import background_thread

# sample function to run in a background thread
def change_val(arg):
    global val
    val = arg

if auto:
    # Start the new thread in one command
    background_thread.start_new_background_thread(change_val, ['Cat'])
else:
    # create a new thread and start it
    t = background_thread.BackgroundThread(
        target=change_val, args=['Cat'])
    t.start()

答案 5 :(得分:0)

Google Flexible App Engine可以在Docker容器中运行任何可执行文件。您可以对多线程可执行文件进行Docker化,然后将其部署在Flexibile App Engine上。我已经做到了,并且按预期工作。