是否允许在GAE中对实例进行长时间初始化?

时间:2018-03-14 15:10:59

标签: python google-app-engine gmail-api

我正在编写一个软件,该软件将自动处理来自用户的Gmail收件箱(我们域中的商家收件箱)的邮件。目的是将此软件部署到Google App Engine,我无法理解以下情况:

在软件启动时,我希望它能够处理自动化开始之前累积的消息。由于我预计收件箱中会有数百条消息,因此这个阶段可能需要一些时间。我正在研究以下选项:

  1. 同步方式:启动一个单独的长时间运行的线程来同步处理挂起的消息,并使用主线程将有关新传入消息的通知放入稍后将处理的单独队列中。 结果:一旦主线程通过其余代码,负责处理挂起消息的线程就会被终止。在阅读the docs之后,现在可以预期这种情况:

      

    请注意,当请求结束时,线程将由运行时连接,因此线程无法在请求结束时运行。

  2. 异步方式:使用批处理调用获取消息并通过回调处理结果。结果:每次预期结果都会重新启动实例并丢失上下文。

    from apiclient.http import BatchHttpRequest
    
    batch = self.service.new_batch_http_request(callback=self.cbk_request_messages)
    batch.add(self.service.users().messages().get(userId='me', id=id, format='metadata'))
    batch.execute()
    
  3. 或者我在这里以完全错误的方式使用GAE?提前谢谢。

1 个答案:

答案 0 :(得分:0)

确实,您丢失了原始请求的上下文,但没有什么能阻止您从该上下文中提取所需信息并将其传递给后续请求,以便他们可以重新创建该上下文。当然,您只需要保留原始实例/请求上下文中的相关信息,而不是短暂的上下文本身。

例如,假设原始请求是在登录后显示用户主页的请求,此时有大量需要处理的新电子邮件。您将无法足够快地处理这些消息,以便立即在该页面中显示电子邮件已处理完毕。但是,您可以获取邮箱信息,并将邮箱信息作为参数排入推送队列中的邮箱处理任务。

该任务获取邮箱信息,处理来自该邮箱的一批电子邮件,如果仍有待处理的电子邮件,则将另一个此类任务排入队列,将邮箱信息传播给它。这些任务一直在运行,直到没有更多的电子邮件要处理。

您甚至可以让主页在后台发出重复的AJAX请求以获取电子邮件处理任务的状态,并且如果需要,可能会显示一些进度信息,例如尚待处理的X电子邮件。