python 协程
协程
Python中的协程和生成器很相似但又稍有不同。主要区别在于: 生成器是数据的生产者 协程则是数据的消费者
首先我们先来回顾下生成器的创建过程。我们可以这样去创建一个生成器:
def fib(): a, b = 0, 1 while True: yield a a, b = b, a+b
然后我们经常在for
循环中这样使用它:
for i in fib(): print i
这样做不仅快而且不会给内存带来压力,因为我们所需要的值都是动态生成的而不是将他们存储在一个列表中。更概括的说如果现在我们在上面的例子中使用yield
便可获得了一个协程。协程会消费掉发送给它的值。Python实现的grep
就是个很好的例子:
def grep(pattern): print("Searching for", pattern) while True: line = (yield) if pattern in line: print(line)
等等!yield
返回了什么?啊哈,我们已经把它变成了一个协程。它将不再包含任何初始值,相反要从外部传值给它。我们可以通过send()
方法向它传值。这有个例子:
search = grep('coroutine') next(search) #output: Searching for coroutine search.send("I love you") search.send("Don't you love me?") search.send("I love coroutine instead!") #output: I love coroutine instead!
发送的值会被yield
接收。我们为什么要运行next()
方法呢?这样做正是为了启动一个协程。就像协程中包含的生成器并不是立刻执行,而是通过next()
方法来响应send()
方法。因此,你必须通过next()
方法来执行yield
表达式。
我们可以通过调用close()
方法来关闭一个协程。像这样:
search = grep('coroutine') search.close()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
2017-02-24 PHP empty、isset、isnull的区别