异步编程

    在异步编程中,函数地执行通常是非阻塞的。换句话说,每次你调用一个函数它就会立即返回,但相对得,这就表示函数并不会在其本来的位置被执行。它有了一种机制(名为 调度程序),让处在执行未来任务的函数随时可以由它进行响应。

    异步编程的意思就是说在任何异步函数开始之前,程序都有可能结束。通常地解决方法是让异步函数返回“future(未来任务)”或者“promises(预先任务)”。让其标识出这是一个异步函数。最终,有调度程序的异步编程框架阻塞或者说等待这些异步函数完成它们的“future(未来任务)”。

    自Python 3.6开始,“asyncio”模块与asyncawait关键字相结合,来让我们写多任务协作程序。在此类编程中,当一个协同函数在顽皮或者等待输入时,都会由yield交出控制权给另一个协同函数。

    事件循环( )是在有很多事物时,Python可以使用调度机制来执行这些异步函数。我们使用循环来让这些函数运行直到完成。
    其中的打印语句是处于同步机制下的,直到我们得到了任何结果(asyncio.sleep(1)结束后)剩下的才会执行。

    之前的例子并不能很好地说明异步编程,因为我们没有写得很复杂,而且也只执行了一次函数。不过你可以想一下,如果你要执行square(x)3次呢:

    1. square(1)
    2. square(2)
    3. square(3)

    因为square()里面有一个睡眠函数,总执行时间差不多要3秒钟。但每次执行一个函数时计算机就会陷入呆滞,在那一秒钟里什么也不做,我们为什么不能让它在之前的那个函数睡眠时来执行下一个呢?我们稍加改动,把它变成异步:

    1. $ python3 python_async.py
    2. Square 1
    3. End square 2
    4. End square 1
    5. End square 3
    6. [1, 4, 9]

    有时我们需要立即处理所返回的结果。对于这种情况,我们可以使用两个协同函数,让它来处理结果,使用asyncio.as_completed()就可以:

    打印出的东西差不多是这样的:

    1. Square 2
    2. Square 1
    3. Result: 9
    4. End square 1
    5. Result: 1
    6. End square 2
    7. Result: 4

    最后要说的是,一个异步函数可以使用await关键字来调用另一个异步函数。

    异步编程部分练习

    1. 写一个异步协同函数,它会将两个变量相加,并且会睡眠这些时间。使用异步循环来调用它。
    2. 修改一下之前的那个程序,让它调度两次。