python 一直在进行并发编程的优化, 比较熟知的是使用 thread 模块多线程和 multiprocessing 多进程,后来慢慢引入基于 yield 关键字的协程。 而近几个版本,python 对于协程的写法进行了大幅的优化。

并发、并行、同步和异步

python协程+使用async 和 await 协程进行并发编程_python

并发指的是 一个 CPU 同时处理多个程序,但是在同一时间点只会处理其中一个。并发的核心是:程序切换。

python协程+使用async 和 await 协程进行并发编程_子函数_02

并行指的是多个 CPU 同时处理多个程序,同一时间点可以处理多个。

python协程+使用async 和 await 协程进行并发编程_返回结果_03

同步:执行 IO 操作时,必须等待执行完成才得到返回结果。 异步:执行 IO 操作时,不必等待执行就能得到返回结果。

这是 python 3.7 里面的基础协程用法,现在这种用法已经基本稳定,不太建议使用之前的语法了。

import asyncio
import time

async def visit_url(url, response_time):
    """访问 url"""
    await asyncio.sleep(response_time)
    return f"访问{url}, 已得到返回结果"

start_time = time.perf_counter()
task = visit_url('http://wangzhen.com', 2)
asyncio.run(task)
print(f"消耗时间:{time.perf_counter() - start_time}")

1, 在普通的函数前面加 async 关键字;
2,await 表示在这个地方等待子函数执行完成,再往下执行。(在并发操作中,把程序控制权教给主程序,让他分配其他协程执行。) await 只能在带有 async 关键字的函数中运行。
3, asynico.run() 运行程序
4, 这个程序消耗时间 2s 左右。

参考文献
https://zhuanlan.zhihu.com/p/133833331