Google App Engine - 队列完成时的事件

Google App Engine - Event when queue finishes

我开始构建一个批量上传工具,我正在努力研究如何完成其​​中一项要求。

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

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

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

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

有一篇很好的文章对此做了一些解释 here

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

我自己还没有用过,只是时间问题:)

也可以实施一种方案来跟踪仍在进行中的相关任务,请参阅

您还可以查看队列(大致)状态,请参阅

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

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

您还可以创建一个 'tasks' table,您可以在其中存储相关列而不是修改现有的 table。

希望这对您有所帮助。

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

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