【问题标题】:Possibility to allow long initialization of the instance in GAE?是否允许在 GAE 中长时间初始化实例?
【发布时间】:2018-08-23 04:39:05
【问题描述】:

我正在编写一个软件,它会自动处理来自用户的 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()
    

或者我在这里以完全错误的方式使用 GAE?提前致谢。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢丹的建议。我想我没有很好地描述第二种情况 - 如果我从前端发出批处理请求,那么回调方法永远不会被调用并且实例被重新启动而不是回调方法执行。我无法以这种方式检索我的操作结果。
    • 您不能使用该方法,因为它需要原始请求上下文。您以同步方式执行此操作,但从推送任务处理程序内部进行。
    • 谢谢,与此同时,我采用了同样的方法,我可以确认它是这样工作的。
    猜你喜欢
    • 2020-04-17
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    相关资源
    最近更新 更多