目录

Python异步IO学习笔记

一、前言

  • 我们在前面分析了同步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
    
  • 协程是不是写起来感觉比线程切换还简单呢?