今天在浏览源代码时,我在Pipeline.start
方法中注意到了这条评论:
Returns:
A taskqueue.Task instance if return_task was True. This task will *not*
have a name, thus to ensure reliable execution of your pipeline you
should add() this task as part of a separate Datastore transaction.
有趣的是,我 希望可靠执行我的管道。
我怀疑评论有点不准确,因为如果您使用默认的return_task=False
选项,则无论如何都会在事务中添加任务(_PipelineContext.start
)...这似乎是您的原因&# 39; d想要自己添加任务,只有当你希望管道的启动依赖于你自己的事务中某些事情的成功时。
任何人都可以证实我的怀疑,或建议在评论的建议之后如何影响和可靠地执行您的管道' ?
答案 0 :(得分:0)
如果您在调用Pipeline.start()
时不包含该参数,则该任务将在由Pipeline的内部变量上下文(类型{ {1}})。此队列的默认名称为_PipelineContext
。
如果您在调用"default"
时执行包含该参数,则该任务不会在这些方法中排队。 Pipeline.start()
将返回Pipeline.start()
,我们发现它依赖于内部方法_PipelineContext.start()
。此方法是带注释的事务性的,因为它首先为用于运行此管道的数据存储区记录执行一些簿记。然后,在完成此簿记之后,它会创建一个没有txn()
属性的任务(请参阅the Task class definition here)。
如果未提供 name
,则会继续将该(未命名)任务添加到此管道上下文的默认队列中。它还为该任务设置return_task
,以便它将成为一个"事务性任务"只有在成功提交封闭数据存储区事务时才会添加(即,transactional
方法中的所有簿记都成功,以便此任务在运行时将与管道的其他部分正确交互等)
另一方面,如果 txn()
未定义 ,则会返回未添加到队列中的未命名任务。尽管如此,仍会进行return_task
簿记工作以使其准备好运行。 txn()
返回_PipelineContext.start()
,用户代码将获取未命名的未添加任务。
如果您希望管道执行成为代码中事务的一部分,那么您想要使用此模式的原因绝对正确。也许您希望接收和存储一些数据,启动管道,并将管道ID存储在数据存储区中某个用户的配置文件中。当然,这意味着您不仅需要将数据存储区事件,还需要将管道执行事件组合到此原子事务中。这种模式可以让你做这样的事情。如果事务失败,则事务任务将不会执行,Pipeline.start()
将能够捕获TransactionFailedError
并运行pipeline.abort()以确保数据存储区的簿记数据已被销毁。从未跑过的任务。
管道未命名的事实不会导致任何中断,因为如果名称未定义,并且事实上not having a name is actually a requirement for tasks which are added with transactional=True
,则在添加到队列时,未命名的任务会自动生成唯一名称。
总而言之,我认为评论只是意味着由于返回的任务是事务性的,为了使其可靠地执行,您应该确保handle_run_exception()
发生在交易。它不是说返回的任务是某种方式"不可靠"仅仅因为你设置了task.add (queue_name...)
,它基本上使用的是"可靠的"多余的,因为任务是在事务中运行的。