【问题标题】:Google App Engine - Event when queue finishesGoogle App Engine - 队列完成时的事件
【发布时间】:2017-08-24 09:43:21
【问题描述】:

我正在开始构建一个批量上传工具,并且正在尝试找出如何满足其中一项要求。

这个想法是用户将上传一个 CSV 文件,该工具将对其进行解析并将 CSV 的每一行作为要运行的任务发送到任务队列。然后,在完成所有任务(与该特定 CSV 文件相关)后,将向用户发送摘要报告。

我使用的是 Google App Engine,过去我使用标准的任务队列来处理任务。但是,对于标准任务队列,无法知道队列何时完成,也不会触发任何事件来触发报告生成,所以我不确定如何实现这一点?

我对此进行了更多研究,并且了解到 Google 还提供 Google PubSub。这更复杂,似乎更适合,但我仍然不知道如何在 PubSub 队列完成时触发和事件,有什么想法吗?

【问题讨论】:

    标签: google-app-engine queue task task-queue


    【解决方案1】:

    看来您可以为此使用计数器。创建一个具有整数属性的实体,该属性设置为 CSV 文件的行数。每个任务在完成对行的处理(在事务中)时,都会减少事务中的计数器。一项任务会将计数器设置为 0,并且该任务可以触发事件。不过,这可能会引起过多的争用。

    另一种可能性是让每个任务在处理完一行后创建一个特定类型的实体。然后,您可以计算这些实体的数量,以确定何时处理了所有行。

    【讨论】:

      【解决方案2】:

      使用 GAE Pipeline API 可能更容易,它会将此作为其功能的基本部分。

      有一篇很好的文章解释了一下here

      还有一个相关的 SO 问题,恰好提到了迁移到这个 API 的相同原因,并且有一个很好的答案:Google AppEngine Pipelines API

      我自己还没有使用它,但这只是时间问题:)

      还可以实施一个方案来跟踪仍然处于活动状态的相关任务,请参阅Figure out group of tasks completion time using TaskQueue and Datastore

      您还可以检查队列(近似)状态,请参阅Get number of tasks in a named queue?

      【讨论】:

      • 谢谢。然而,我使用的是 PHP,这些库似乎只支持 java 和 python。还有其他想法吗?
      【解决方案3】:

      本周早些时候我遇到了类似的问题,并设法找到了一个很好的解决方法。我所做的是我在表中创建了一个额外的列,任务将数据插入其中。完成特定任务后,它会使用“done”更新此“task_status”列,否则将保留为默认空值。然后当用户刷新页面或转到特定 URL 或您执行 AJAX 调用以查询表中特定 id 的任务状态时,您可以查看它是否完成。

      select * from table where task_status is not null and id = ?;
      

      您还可以创建一个“任务”表,您可以在其中存储相关列,而不是修改现有表。

      希望这对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-29
        • 1970-01-01
        相关资源
        最近更新 更多