我想设计一个可以很容易地做出数据处理管道的异步管道。管道由几个功能组成。输入数据进入管道的一端,并在另一端出来。如何在python中设计一个异步管道模式
我想设计在一个方法管道:
- 附加功能可以在管道
- 功能已经在流水线可以被弹出来插入。
这里是我想出了:
import asyncio
@asyncio.coroutine
def add(x):
return x + 1
@asyncio.coroutine
def prod(x):
return x * 2
@asyncio.coroutine
def power(x):
return x ** 3
def connect(funcs):
def wrapper(*args, **kwargs):
data_out = yield from funcs[0](*args, **kwargs)
for func in funcs[1:]:
data_out = yield from func(data_out)
return data_out
return wrapper
pipeline = connect([add, prod, power])
input = 1
output = asyncio.get_event_loop().run_until_complete(pipeline(input))
print(output)
这个工作,当然,但问题是,如果我想添加另一个函数到(或从弹出的功能)这条管道,我必须再次拆卸和重新连接每个功能。
我想知道是否有更好的方案或设计模式来创建这样的管道?
我认为标准的事情就是重新创建管道,例如'connect([add,prod,somethingelse,power])'或者connect([add,power])'。有没有你不想这样做的原因?或者我不明白你的问题? – maxymoo
我想你已经明白了我的观点,我不想重新创建整个事情,仅仅因为当你只需要改变一小部分,如果管道包含许多功能并且我需要经常更改一些功能,重新创建一切变得乏味和低效。 – shelper
看起来您可以创建一个Pipeline类并使用您的函数列表维护一个实例var,然后实现从该列表中获取/删除函数的方法。然后只需实现'__call__',以便可以将Pipeline的实例发送到asyncio事件循环。 –