擅长:python、mysql、java
<p>当您运行类似<code>taskqueue.add(url='/worker', params={'cursor': cursor})</code>的代码时,您正在将一个任务排入队列;使用您提供的参数调度请求在带外执行。显然,你可以在一次手术中安排多达100次。在</p>
<p>不过,我觉得你不想。任务链接将使这一点变得简单得多:</p>
<p>您的辅助任务将执行以下操作:</p>
<ul>
<li><p>运行查询以获取一些记录以进行处理。如果任务参数中提供了游标,请使用它。将查询限制为10条记录,或者您认为可以在30秒内完成的任何记录。</p></li>
<li><p>流程</10></li>
<li><p>如果您的查询返回10条记录,请将另一个任务排队,并将查询中更新的游标传递给它,这样它就可以从您停止的地方获取信息。</p></li>
<li><p>如果你的记录少于10张,你就完了。万岁!发一封电子邮件什么的然后辞职。</p></li>
</ul>
<p>有了这个路线,你只需要启动第一个任务,其余的任务就可以自己添加了。在</p>
<p>请注意,如果一个任务失败,appengine将重试该任务,直到任务成功为止,因此您不必担心数据存储中断导致一个任务超时并中断链。在</p>
<p><strong>编辑:</strong></p>
<p>上述步骤并不保证一个实体只被处理一次。任务通常只运行一次,但Google建议您为幂等性进行设计。如果这是一个主要的问题,这里有一个方法来处理它:</p>
<ul>
<li><p>在每个要处理的实体上放置一个状态标志,或者创建一个补充实体来保存该标志。它应该具有类似于Pending、Processing和Processed的状态。</p></li>
<li><p>获取要处理的新实体时,事务性地锁定并递增处理标志。仅在实体处于挂起状态时运行该实体。处理完成后,再次增加标志。</p></li>
</ul>
<p>请注意,在开始之前,并不一定要向每个实体添加处理标志。“挂起”状态可能意味着属性或相应的实体尚不存在。在</p>