如何优雅地中止App Engine管道?

时间:2015-04-30 22:44:16

标签: python google-app-engine mapreduce appengine-pipeline

问题

我有一系列管道:

class PipelineA(base_handler.PipelineBase):
  def run(self, *args):
    # do something

class PipelineB(base_handler.PipelineBase):
  def run(self, *args):
    # do something


class EntryPipeline(base_handler.PipelineBase):
  def run(self):

    if some_condition():
      self.abort("Condition failed. Pipeline aborted!")

    yield PipelineA()

    mr_output = yield mapreduce_pipeline.MapreducePipeline(
      # mapreduce configs here
      # ...
    )

    yield PipelineB(mr_output)

p = EntryPipeline()
p.start()

EntryPipeline中,我在开始PipelineAMapreducePipelinePipelineB之前测试了一些条件。如果条件失败,我想中止EntryPipeline和所有后续管道。

问题

  1. 什么是优雅的管道流产? self.abort()是正确的做法,还是我需要sys.exit()

  2. 如果我想在PipelineA内进行堕胎怎么办?例如PipelineA成功启动,但阻止后续管道(MapreducePipelinePipelineB)启动。

  3. 编辑:

    我最终将条件语句移到EntryPipeline之外,所以只有条件为真时才开始整个事情。否则我认为尼克的回答是正确的。

1 个答案:

答案 0 :(得分:1)

由于文档目前说" TODO:谈论明确的中止和重试 "

我们必须阅读来源:

https://developer.foursquare.com/categorytree

  def abort(self, abort_message=''):
    """Mark the entire pipeline up to the root as aborted.
    Note this should only be called from *outside* the context of a running
    pipeline. Synchronous and generator pipelines should raise the 'Abort'
    exception to cause this behavior during execution.

    Args:
      abort_message: Optional message explaining why the abort happened.

    Returns:
      True if the abort signal was sent successfully; False if the pipeline
      could not be aborted for any reason.
    """

因此,如果你有 some_pipeline 的句柄 自我,你可以调用 some_pipeline.abort( ) ...但是如果你想中止自己,你需要提高Abort() ......这会冒泡到顶部并杀死整棵树