python协程三种实现方法

协程的三种方法
本教程先介绍协程的几个专用词,后面介绍了三种实现协程的方法,分别是yield from,@coroutine装饰器和async/await等,同吋也介绍了这三种方式的调用方法和执行过程。

1,协程中名词
event_loop 事件循环:程序开启一个无限的循环,程序员会把一些函数(协程)注册到事件循环上。当满足事件发生的时候,调用相应的协程函数。
coroutine 协程:协程对象,指一个使用async关键字定义的函数,它的调用不会立即执行函数,而是会返回一个协程对象。协程对象需要注册到事件循环,由事件循环调用。
future 对象: 代表将来执行或没有执行的任务的结果。它和task没有本质的区别。
task 任务:一个协程对象就是一个原生可以挂起的函数,任务则是对协程进一步封装,其中包含任务的各种状态。
Task 对象是 Future 的子类,它将 coroutine 和 Future 联系在一起,将 coroutine 封装成一个 Future 对象。
async/await 关键字:python3.5 用于定义协程的关键字,async定义一个协程,await用于挂起阻塞的异步调用接口。其作用在一定程度上类似于yield。

2,用yield 和yield from

def a():
yield 1
yield 2
yield from b() //暂停,运行b函数,直至结束再回来继续。
yield 6

def b():
yield 5
yield 3
yield 4

调用方法:
n = a()
for i in n:
print(i)

当调用函数a()时,先返回1,2,再返回b函数中的5,3,4,b函数执行完后自动返回a函数,接着返回a函数最后的6。

3,用asyncio装饰器,py3.4以上,此方法必须在定义函数前加上coroutine装饰器,并导入asyncio包。

@asyncio.coroutine
def f1():
print(1)
print(2)
yield from asyncio.sleep(2) #阻塞2秒
//阻塞暂停,运行别的函数,当别的函数也有这样的阻塞产生时,再回来查看此函数的阻塞是否结束,若结束就继续执行,若没结束,继续找别的是否可执行。
print(6)

@asyncio.coroutine
def f2():
print(5)
yield from asyncio.sleep(2) #阻塞2秒
#因阻塞暂停,运行别的函数,当别的函数也有这样的阻塞产生时,再回来查看此函数的阻塞是否结束,若结束就继续执行,若没结束,继续找别的是否可执行。
print(4)

调用方法

创建task任务列表
tasks = [asyncio.ensure_future(f1()),asyncio.ensure_future(f2())]
创建循环器
loop = asyncio.get_event_loop()
把任务绑定了循环器
loop.run_until_complete(asyncio.wait(tasks))

调用f1,f2时会选回f1的1,2,暂停2秒,但程序不会闲下等时间,而是立马执行f2函数,返回5,当碰到yield from asyncio.sleep(2) 时又阻塞了,程序会立马检查别的可执行的代码,以此反复。

4,用async和await关键字,py3.5以上,定义函数前必须加async关键词,并导入asyncio包。

async def func1():
print(1)
print(2)
await asyncio.sleep(2) #阻塞2秒,
#阻塞暂停,运行别的函数,当别的函数也有这样的阻塞产生时,再回来查看此函数的阻寒是否结束,若结束就继续执行,若没结束,继续找别的是否可执行。
print(6)

async def func2():
print(5)
await asyncio.sleep(2) #阻塞2秒
#阻塞暂停,运行别的函数,当别的函数也有这样的阻塞产生时,再回来查看此函数的阻寒是否结束,若结束就继续执行,若没结束,继续找别的是否可执行。
print(3)

调用方法:

创建任务列表
tasks = [asyncio.ensure_future(func1()),asyncio.ensure_future(func2())]
创建事件循环器
loop = asyncio.get_event_loop()
把任务列表绑定到循环器
loop.run_until_complete(asyncio.wait(tasks))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值