python3提供了协程专用的关键字async await
, 还提供了asyncio
库, 来进行异步非阻塞的io操作
异步非阻塞的io操作?
没有老师检查我也不知道自己算不算完全懂了, 就不做无用功尝试说得通俗易懂了.
想要从原理开始理解的话, 推荐tornado的文档
我为何使用asyncio
来代替传统线程进行io操作?
- 由于时间主要耗费在io操作上, 其他操作并发需求不大.
- 不用规定并行多少, 比较方便稳定.
- 熟悉tornado工作原理
举例
并行访问某网页十次
import asyncio
import requests
loop = asyncio.get_event_loop()
async def t():
get = lambda:requests.get('http://baidu.com')
temp = await loop.run_in_executor(None, get)
print(temp)
loop.run_until_complete(asyncio.gather(*[t() for i in range(10)]))
上面这几行代码就可以完成这些操作了.
loop = asyncio.get_event_loop()
协程本身并不具备并行能力, 但是有了这个事件loop就可以进行并行io请求
get = lambda:requests.get('http://baidu.com')
temp = await loop.run_in_executor(None, get)
一般函数是无法被await修饰的, 必须用api封装一下(感觉很像threading), 我之所以再封装一次get, 是因为run_in_executor
传参数比较坑, 不支持**kwargs
loop.run_until_complete(asyncio.gather(*[t() for i in range(10)]))
run_until_complete
这个api是指运行内容物直到结束(api如其名), gather
是把任务组合到一起, 如果*
的部分有迷惑的话, 你写asycio.gather(t(),t(), t()...)
也是可以的.
おわり.