Google App Engine - 队列结束时的事件



我正在开始构建一个批量上传工具,我正在尝试解决如何满足其中一个要求。

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

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

我研究了更多,我知道谷歌也提供谷歌PubSub。这更复杂,似乎更适合,但我仍然找不到如何在 PubSub 队列完成时触发和事件,有什么想法吗?

似乎你可以为此使用计数器。 使用设置为 CSV 文件的行数的 Integer 属性创建一个实体。 每个任务在完成处理行(在事务中(时将递减事务中的计数器。一个任务会将计数器设置为 0,该任务可以触发事件。不过,这可能会导致太多争用。

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

使用 GAE 管道 API 可能更容易,它将作为其功能的基本部分来处理这一点。

这里有一篇很好的文章来解释它。

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

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

还可以实现一个方案来跟踪仍处于活动状态的相关任务,请参阅使用 TaskQueue 和数据存储找出任务完成时间组。

您还可以检查队列(近似(状态,请参阅获取命名队列中的任务数?

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

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

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

希望这能找到你的用处。

最新更新