python异步初步窥探

时间:2022-12-07 19:15:08

1.异步之难:因为其执行吮吸不可预料,当下正要发生什么事件不可预料。
        程序下一步行为往往依赖上一步值执行结果,如何知晓上次异步调用已完成并获取结果,
        回调成了必然选择,那又需要面临“回调地狱”的折磨
2.事例:例如我前不久主导重写的项目,使用Python异步编程,改版后由原来的7台服务器削减至3台,成本骤降57%。
3.名言:除了瓶颈之外,任何改进都是幻觉
4.I/O是计算机运行速度提升的最大瓶颈。最大地球上最发达、规模最大的计算机程序,莫过于因特网,网络I/O是最大的瓶颈。所以,诸多异步框架都针对的是网络I/O。
5.爬虫:自动从万维网上获取信息的脚本。例如,搜索引擎从万维网上获取网页。
6.分进程的时间主要耗在:进程切换开销。当进程数量大于CPU核心数量时,进程切换时必然需要的。
  多进程另一个缺点:状态共享。(Process)
7.继续改进,多线程:一个python进程中,只允许有一个线程处于运行状态。线程调度是抢占式的,所以也存在竞态条件的可能,如何保证执行过的线程不会重复执行。
8.GIL:为了解决多线程问题,即线程间数据一致性和状态同步。而解决最简单方法就是加锁,于是有了GIL这把大锁(Global Interpreter Lock)。
9.非阻塞方式:可能在等待一个结果时候,cpu会存在空闲下来的时候。如何有效利用这段COU空闲时间成了下一步主要解决的问题。
10.非阻塞方式改进:OS将I/O状态的变化都封装成了事件。并且提供了专门的系统模块(演变:select-->poll-->kqueue(BSD内核),epoll(Linux内核))让应用程序可以接收事件通知。当接收到要等到的通知之后,通过事件回调继续执行。
11.总结:从同步阻塞到异步非阻塞,异步编程大多数应用  事件循环+回调,当然大多数时间都花在设计回调函数上。


12.事件循环+回调-->asynclo原生协程模式
13.事件循环+回调这种方式存在问题:回调层次过多时代码可读性差;破坏代码结构,共享状态管理困难,错误处理困难。
   Python 生态也以终为始,秉承着“程序猿不必难程序猿”的原则,让语言和框架开发者苦逼一点,也要让应用开发者舒坦。
   在事件循环+回调的基础上衍生出了基于协程的解决方案,代表作有:Tornado、Twisted、asyncio 等。
14.异步编程最大的困难:异步任务何时执行完毕?接下来要对异步调用的返回结果做什么操作?
   上述问题已经通过事件循环和回调解决了。程序知道当前所处的状态,而且要将在不同的回调之间延续下去。
   为了规避事件循环和回调的问题,采用协作式多任务。任务之间得相互通知,每个任务有自己的状态。
15.协程:协作式的例程。它是非抢占式的多任务子例程的概括,可以允许有多个入口点在例程中确定的位置来控制程序的暂停与恢复执行。
   例程:编程语言定义的可被调用的代码段,一般用成为函数或方法的代码结构体来体现。
16.早期发现生成器的特点和协程很像。每一次迭代之间,会暂停执行,继续下一次迭代的时候还不会丢失先前的状态。
17.基于生成器的协程来实现:
18.未来对象:怎么知道异步调用的结果?先设计一个对象,异步调用执行完的时候,就把结果放在它里面。这种对象称之为未来对象。
19.用 yield from 改进生成器协程。
20.Python 3.6中asyncio库成为标准库的正式一员。