Python异步async/await概念、用法(一)

  • IO编程与同步异步

    同步异步、阻塞非阻塞,都是围绕着IO展开的概念。

    多线程和多进程的模型虽然解决了并发问题,但是系统切换线程的开销也很大。

    另一种解决IO问题的方法是异步IO。当代码需要执行一个耗时的IO操作时,它只发出IO指令,并不等待IO结果,然后就去执行其他代码了。一段时间后,当IO返回结果时,再通知CPU进行处理。

    在“发出IO请求”到收到“IO完成”的这段时间里,同步IO模型下,主线程只能挂起(让出CPU时间片),但异步IO模型下,主线程并没有休息,而是在消息循环中继续处理其他消息。这样,在异步IO模型下,一个线程就可以同时处理多个IO请求,并且没有切换线程的操作。

  • IO编程

    计算机的核心是CPU,CPU运算的程序、数据只能是内存中的,因此CPU运行的时刻所需的元素都要已经在内存中,对于没有放在内存中的,需要载入(input)内存,计算完用不到的数据就需要输出(output)到磁盘上。

    因为CPU计算速度远高于I/O速度,就有了I/O编程这个细分领域。

    CPU一次只能运行一个进程。

    在这样几个条件下,就有了I/O编程的几个方案:

    1. 让CPU等着I/O完成,才继续执行后续代码:称为同步
    2. CPU不等待I/O,去干别的事情:称为异步

    同步异步的区别,就是CPU是否等待IO执行的结果。

    操作IO的能力最终都是由操作系统实现的,各种语言都是把操作系统的提供的接口封装起来。

    把变量从内存中编程可存储或传输的过程称之为序列化Python中称为pickling,就是pickle模块干的事情。

  • 子程序(又称为函数)

    就是传统意义上的函数:

    • 在所有语言中都是层级调用;
    • 子程序的调用时通过栈实现的;
    • 一个线程就是执行一个子程序;
    • 子程序的调用总是一个入口、一次返回,调用顺序明确
  • 协程(Coroutine)

    又称为微线程,纤程。

    协程看上去时子程序,但执行过程中,在子程序内部可中断,转而执行别的子程序。

    这里提到的中断并执行其它子程序不是函数调用

    def A():
        print('1')
        print('2')
        print('3')
    
    def B():
        print('x')
        print('y')
        print('z')
        
    # 在协程下输出结果可能是
    1
    2
    x
    y
    3
    z
    # 关键点在于,这里并不是A调用B
    

    不是函数调用,结果看起来像是多线程,但协程时在一个线程中执行的。

    子程序就是协程的一种特例。

    与多线程相比:

    • 协程执行效率高,因为子程序切换不是线程切换,没有线程切换的开销
    • 不需要多线程的锁机制
  • 协程利用多核CPU

    协程内执行多个子函数,且是在同一个线程中执行。

    想要充分利用多核CPU,方法是多进程+协程。

  • Python与协程

    Python对协程的支持是通过generator实现的。

    涉及generatornextyeild几个概念。

  • asyncio与async/await区别

    asyncio官方文档)是Python3.4 引入的支持异步IO的标准库,采用yeild语法;

    async/awaitPython3.5引入的简化代码的新语法,是Python3.3中的yield fromPython3.4中的asyncio结合起来产生的新语法。用于解决Python异步编程中无法有效区分yield生成器与异步的关系这个问题。

    需要先补充下预备知识:

    Python中yield概念、用法理解

  • Reference

  1. 廖雪峰的官方网站
  2. Python 3.5中async和await怎么会工作呢?
发布了880 篇原创文章 · 获赞 1331 · 访问量 98万+

猜你喜欢

转载自blog.csdn.net/The_Time_Runner/article/details/105646093