当生产者用尽时,有没有办法发出协同信号?

时间:2016-12-06 14:49:43

标签: python python-3.x

我正在使用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)

1 个答案:

答案 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)