当制作人筋疲力尽时,有没有一种方法可以发出合作的信号?

2024-05-29 05:52:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用一个事件驱动的数据管道的协程管道。到目前为止一切都很顺利。我想尝试分批处理一些输入,但需要一种方法来确保在上游生产商为空时处理最后一批。在下面的人工示例中,这是一种在produce_data_from完成后print(res)print_data_cpprint(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)

Tags: 方法函数infromdata管道进程consumer
1条回答
网友
1楼 · 发布于 2024-05-29 05:52:10

此修改使用try/finally并更改生产者以关闭使用者协进程。这将触发finally块。这里,协处理器依赖于生产者发送close()信号,因此将消费者函数修改为批处理也需要修改上游生产者函数。不太理想,但它的工作和感觉肾盂足够。我很高兴看到其他的方法

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)

相关问题 更多 >

    热门问题