Python异步IO学习笔记
目录
- 更多分享:http://www.catbro.cn
一、前言
- 我们在前面分析了同步IO以及异步IO的相关知识
- 本次我们将进一步学习python中异步IO开发的相关知识点
二、Asyncio:Python异步IO模块
- asyncio 类似于 C++ 的 Boost.Asio
- 当然因为 GIL(全局解释器锁)的存在,Asyncio 并不能带来真正的并行,同样的Python 的多线程也不能带来真正的并行。
- asyncio 为我们简化了编写协程代码的步骤,解放我们的双手。
方法说明:
- 1、asyncio.iscoroutinefunction():判断函数是否是协程函数。如果是返回True。
- 2、asyncio.sleep():其也是个携程函数,其作用是延迟指定时间。内部也是通过消息循环器来实现的。
- 3、asyncio.get_event_loop():获取消息循环器。
- 4、loop.run_until_complete():执行传入协程函数后开始阻塞线程,直到协程函数执行完后继续。
- 5、loop.close():关闭消息循器
三、定义协程
方式一:
-
我们可以通过 asyncio提供的装饰器来定义协程函数
-
可以通过 asyncio.iscoroutinefunction 来验证我们定义的协程函数:
import asyncio @asyncio.coroutine def do_some_work(): print('start working....'); r = yield from asyncio.sleep(1); print('working ended.'); asyncio.iscoroutinefunction(do_some_work()); loop = asyncio.get_event_loop(); loop.run_until_complete(do_some_work()) print('call close') loop.close()
-
结果输出为:
True start working.... working ended. call close
-
如上我们就完成来一个协程函数的编写。
-
假设,如果我们有多个协程函数需要同时执行,那此时我们该如何编写呢?
-
我们可以按如下这样编写即可,也很简单哦。
-
代码修改如下:
import asyncio @asyncio.coroutine def do_some_work(): print('start working....'); r = yield from asyncio.sleep(1); print('working ended.'); loop = asyncio.get_event_loop(); tasks = [do_some_work(),do_some_work()]; loop.run_until_complete(asyncio.wait(tasks)) print('call close') loop.close()
-
结果输出为:
start working.... start working.... working ended. working ended. call close
-
Ok,是不是很简单呢?其实我们还有更简单的写法哦,从Python 3.5开始引入了新的语法async和await,可以让coroutine的代码更简洁易读:
-
Ok,我们来修改下代码
-
代码修改如下:
import asyncio async def do_some_work(): print('start working....'); r = await asyncio.sleep(1); print('working ended.'); loop = asyncio.get_event_loop(); tasks = [do_some_work(),do_some_work()]; loop.run_until_complete(asyncio.wait(tasks)) print('call close') loop.close()
-
结果输出如下:
start working.... start working.... working ended. working ended. call close
-
协程是不是写起来感觉比线程切换还简单呢?