具有异步协程的管道

时间:2019-03-06 22:10:40

标签: python-3.x pipeline python-asyncio coroutine

我是asyncio的新手,并且使用asyncio协程实现了某种形式的管道。 主要思想是使带有协程的不同管道连接到 在有效负载中聚合信息,然后将有效负载保存在数据库中。

class ExamplePipeline(PipelineBaseClass):
    def __init__(self):
        PipelineBaseClass.__init__(self)
        self.stages = [get_some_info, build_message,n,..,save_to_db]
        self.wrapper = self.connect(self.stages)

    def connect(self, stages):
        def wrapper(*args, **kwargs):
            data_out = yield from stages[0](*args, **kwargs)
            for stage in stages[1:]:
                data_out = yield from stage(data_out)
            return data_out
        return wrapper

    def run(self, data_in):
      asyncio.get_event_loop().run_until_complete(self.wrapper(data_in))

每个阶段的功能都是协程,假设类似

@asyncio.coroutine
def get_some_info(payload):
      payload = call_an_endpoint
      return payload

@asyncio.coroutine
def build_message(payload):
      #do some logic
      return payload

我有一个新的要求,在某些情况下,build_message co例程 需要分叉其余的管道,这是其余阶段 n..save_to_db必须使用不同的有效负载执行x次,因为 build_message。

[get_some_info, build_message -> payload 1 [n, .. , save_to_db]
                                 payload 2 [n, .. , save_to_db]
                                 payload x [n, .. , save_to_db]

所以最后我在数据库上有x条不同的消息。

如何在这种情况下实现我的新功能?

0 个答案:

没有答案