我正在使用一个事件驱动的数据管道的协程管道。到目前为止一切都很顺利。我想尝试分批处理一些输入,但需要一种方法来确保在上游生产商为空时处理最后一批。在下面的人工示例中,这是一种在produce_data_from
完成后print(res)
在print_data_cp
中print(res)
的方法。一种更直接的模拟方法是,每当res
的长度==3时,打印并重置res
,并保证在生产者完成后打印res中的剩余值。我知道有几种方法可以解决这个问题,但是有没有一种惯用的方法来解决这个问题(例如sentinel value,return remains,while/finally,wrap in class)
现在,我将协进程函数作为类的一部分,并让res
作为实例变量,以便在协进程函数完成后可以访问它。这是可行的,但可能需要一段时间/最后会更一般
def produce_data_from(data, consumer):
next(consumer)
for x in data:
consumer.send(x)
def print_data_cp():
res = []
while True:
x = (yield)
res.append(x)
print(x)
cons = print_data_cp()
produce_data_from(range(10), cons)
此修改使用try/finally并更改生产者以关闭使用者协进程。这将触发finally块。这里,协处理器依赖于生产者发送
close()
信号,因此将消费者函数修改为批处理也需要修改上游生产者函数。不太理想,但它的工作和感觉肾盂足够。我很高兴看到其他的方法相关问题 更多 >
编程相关推荐