我正在使用coroutine管道来处理事件驱动的数据管道。到目前为止,一切都很好。我想尝试批量处理一些输入,但需要一种方法来确保在上游生产者为空时处理最终批次。在下面的设计示例中,这将是print(res)
在print_data_cp
完成后produce_data_from
的一种方式。更直接的模拟是每次长度== 3时打印和重置res
,并保证在生成器完成后打印res中的剩余值。我知道有几种方法可以解决这个问题,但这个问题是否有惯用的方法(例如,哨兵值,返回余数,而/最后,在课堂上换行)?
现在,我将coprocess函数作为类的一部分,让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)
答案 0 :(得分:0)
此修改使用try / finally并更改生产者以关闭使用者协同进程。这会触发finally块。这里,协处理器依赖于生产者发送close()
信号,因此将消费者功能修改为批处理也需要修改上游生产者功能。不理想,但它的工作和感觉足够pythonic。我很高兴看到其他方法。
def produce_data_from(data, consumer):
next(consumer)
for x in data:
consumer.send(x)
consumer.close()
def print_data_cp():
res = []
try:
while True:
x = (yield)
res.append(x)
if len(res) >= 3:
print(res)
res = []
finally:
print(res)
cons = print_data_cp()
produce_data_from(range(10), cons)