python协程 详解

python 3.5中使用语法糖 async 和 await 实现协程。

协程这个概念和进程、线程类似,都是程序运行的方式。使用协程可以高效的处理IO密集的问题,因为不需要出让GIL锁,它比多线程的速度要快。

如何以协程的方式运行一个函数?

首先使用async语法糖定义一个

async def async_function():
  return 1

这个函数原本是types.FunctionType, 使用语法糖后编程types.CoroutineType,可以使用协程执行

执行这样的函数不能直接调用,直接调用会返回一个coroutine object,而是需要调用

loop = asyncio.get_event_loop()
res = loop.run_until_complete(buy_potatos())
loop.close()

await关键字是什么作用?

1、只有用async包裹的函数和生成器才可以使用await关键字

2、await用于挂起自身协程,等待其他协程完成。所以如果要同时执行多次函数,函数里的所有操作都需要加上await关键字

这样才可以实现异步而非阻塞

3、await后面的对象需要是一个Awaitable,或者实现了相关的协议。

所以有一些操作,如打开文件、请求网站、等待时间需要使用特殊的对象。一个类实现了__await__方法,那么通过它构造出来的实例就是一个Awaitable

async def func():
await asyncio.sleep(0.5) #使用await time.sleep(1)会报错
print(1)

tasks = [asyncio.ensure_future(func()) for i in range(10)]
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))


aiofiles.open(path, mode='wb')
原文地址:https://www.cnblogs.com/yjybupt/p/14436969.html