gpt4 book ai didi

python - python 中的协同程序提供了什么来改进天真的消费者/生产者设置?

转载 作者:太空狗 更新时间:2023-10-30 03:07:14 26 4
gpt4 key购买 nike

我已经阅读了一些关于协程的内容,尤其是 python,但有些内容对我来说并不是很明显。

我已经实现了生产者/消费者模型,其基本版本如下:

#!/usr/bin/env python

class MyConsumer(object):

def __init__(self, name):
self.__name = name

def __call__(self, data):
return self.observer(data)

def observer(self, data):
print self.__name + ': ' + str(data)

class MyProducer(object):

def __init__(self):
self.__observers = []
self.__counter = 0

def add_observer(self, observer):
self.__observers.append(observer)

def run(self):
while self.__counter < 10:
for each_observer in self.__observers:
each_observer(self.__counter)

self.__counter += 1

def main():

consumer_one = MyConsumer('consumer one')
consumer_two = MyConsumer('consumer two')
producer = MyProducer()

producer.add_observer(consumer_one)
producer.add_observer(consumer_two)

# run
producer.run()

if __name__ == "__main__":
main()

显然,MyConsumer 也可以有用于生成的例程,因此可以轻松构建数据管道。正如我在实践中实现的那样,定义了一个基类来实现消费者/生产者模型的逻辑,并实现了在子类中覆盖的单一处理功能。这使得使用易于定义的隔离处理元素生成数据管道变得非常简单。

在我看来,这似乎是为协同程序提供的典型应用程序类型,例如在经常引用的教程中:http://www.dabeaz.com/coroutines/index.html .不幸的是,我并不清楚协程相对于上述实现的优势是什么。我可以看到,在可调用对象更难处理的语言中,可以有所收获,但对于 Python,这似乎不是问题。

任何人都可以为我阐明这一点吗?谢谢。

编辑:抱歉,上面代码中的生产者从 0 到 9 计数并通知消费者,然后消费者打印出他们的名字和计数值。

最佳答案

当使用协程方法时,有时消费者和生产者代码都可以更简单。在您的方法中,至少其中一个必须写成有限状态机(假设涉及某些状态)。

使用协程方法,它们本质上是独立的进程。

一个例子会有所帮助:

以您提供的示例为例,但现在假设消费者仅在每第二次输入时打印一次。您的方法需要添加一个对象成员来指示接收到的输入是奇数样本还是偶数样本。

def observer(self, data):
self.odd_sample = !self.odd_sample
if self.odd_sample:
print str(data)

当使用协程时,人们只会循环输入,每隔一秒丢弃一次输入。 “状态”由代码中的当前位置隐式维护:

while True:
y = producer()
print(y)
y = producer()
# ignore this value

关于python - python 中的协同程序提供了什么来改进天真的消费者/生产者设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5677768/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com