0

https://code.google.com/p/appengine-pipeline/wiki/GettingStarted#Execution_ordering

我尝试添加一个在 Log2Bq 完成后执行的回调函数。但无论我使用pipeline.After还是pipeline.InOrder. 在以下代码示例中,任务队列将立即执行,无需等待 Log2Bq。要解决此问题,我是否需要创建另一个管道来保存任务队列以使执行顺序有效?

class Log2Stat(base_handler.PipelineBase):
    def run(self, _date):
        print "start track"
        with pipeline.InOrder():
            yield pipelines.Log2Bq()

            print "finish track"
            taskqueue.add(
                url='/worker/update_daily_stat',
                params={
                    "date": str(_date.date())
                }
            )
4

1 回答 1

2

pipeline.InOrder()并且pipeline.After()仅用于订购管道执行,而不是代码执行。

有一个名为finalized的方法,它在最后一个输出写入后立即执行,即当你的Log2Bq()管道完成它的执行时,所以:

class Log2Stat(base_handler.PipelineBase):
    def run(self, _date):
        print "start track"
        yield pipelines.Log2Bq()

    def finalized(self):
        print "finish track"
        taskqueue.add(
            url='/worker/update_daily_stat',
            params={
                "date": str(_date.date())
            }
         )

如果你想使用 pipeline.InOrder() 或 pipeline.After() 你应该将你的任务队列代码包装在其他管道中并在之后产生它pipelines.Log2Bq()

with pipeline.InOrder():
      yield pipelines.Log2Bq()
      yield pipelines.YourOtherPipeline()
于 2013-08-01T17:37:49.210 回答