在python的网络模型中,为了实现高并发有很多方案:多线程、多进程。无论多线程和多进程,IO的调度更多取决于系统,而协程的方式,调度来自用户
使用协程可以实现高效的并发任务。而这个操作就叫异步IO(asyncio)
简单来说:当我们发起一个 IO 操作,而不用等待指令集结束,就可以继续做其他事情,当它结束时,会得到相应的通知
Asyncio 并不能带来真正的并行(parallelism)。当然,因为 GIL(全局解释器锁)的存在,使用Cython作为Python解释器(最常见的解释器)的多线程也不能带来真正的并行。
交给 asyncio执行的任务,称为协程(coroutine)。一个协程可以放弃执行,把机会让给其它协程(即 yield from 或 await)。
首先来认识一下Coroutine,我已经对每段代码都加上了注释
import asyncio# asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持。async def coroutine(): print('in coroutine')# asyncio的编程模型就是一个消息循环# 从asyncio模块中直接获取一个EventLoop的引用event_loop = asyncio.get_event_loop()try: print('starting coroutine') coro = coroutine() print('entering event loop') # 把需要执行的协程,这里也就是coroutine扔到EventLoop中执行 event_loop.run_until_complete(coro)finally: print('closing event loop') event_loop.close()
import asyncioasync def coroutine(): print('in coroutine') # 增加了一个返回值 return 'result'event_loop = asyncio.get_event_loop()try: # 有了之前的基础,我们这里就不再单独获取coroutine的对象了 # run_until_complete会返回coroutine的返回值 return_value = event_loop.run_until_complete(coroutine()) print(f'it returned: {return_value}')finally: event_loop.close()
import asyncio# 函数1async def one(): print('in one') asyncio.sleep(1) print('one end') return 'one'# 函数2async def two(arg): print('in two') asyncio.sleep(1) print('two end') return 'two with arg {}'.format(arg)# 将作为coroutineasync def outer(): print('in outer') print('waiting for one') # 等待函数1的返回值 result1 = await one() print('waiting for two') # 等待函数2的返回值 result2 = await two(result1) # 将2个结果一并返回 return result1, result2event_loop = asyncio.get_event_loop()try: return_value = event_loop.run_until_complete(outer()) print(f'result value: {return_value}')finally: event_loop.close()
python通过 asyncio 来实现异步请求
在python3.5开始,使用关键字 async 来定义 coroutine 实体函数
使用关键字 await 来等待 coroutine 的返回值
目前我开了2个主群,我邀请了一些我的BAT伙伴前来助阵。定期也会在群里组织抽奖、送书等活动。更有各种资源分享。
目前2个主群都以过百,想要加入的小伙伴,可以加我微信,我拉你们,或者公众号回复关键“关注作者”。
另外:「高级群」已经升级啦!如果你错过了种子轮,难道还要错过天使轮吗?群内不定期组织红包接龙,每天中午1小时的随即话题讨论,没有广告,只聊技术、生活,这样的群上哪找?
文章有问题?点此查看未经处理的缓存