0%

异步编程的理解

2019年12月14日 上午11:46

Python 异步编程入门 - 阮一峰的网络日志

  1. 有了 多线程(threading)和多进程(multiprocessing) ,就没必要一定支持异步了。如果一个线程(或进程)阻塞,新建其他线程(或进程)就可以了,程序不会卡死。
  2. 但是,多线程有”线程竞争”的问题,处理起来很复杂,还涉及加锁。对于简单的异步任务来说(比如与网页互动),写起来很麻烦。
  3. asyncio 模块最大特点就是,只存在一个线程,跟 JavaScript 一样。
    由于只有一个线程,就不可能多个任务同时运行。
    • asyncio 是”多任务合作”模式(cooperative multitasking),允许异步任务交出执行权给其他任务,等到其他任务完成,再收回执行权继续往下执行,这跟 JavaScript 也是一样的。
    • 由于代码的执行权在多个任务之间交换,所以看上去好像多个任务同时运行,其实底层只有一个线程,多个任务分享运行时间
    • 表面上,这是一个不合理的设计,明明有多线程多进程的能力,为什么放着多余的 CPU 核心不用,而只用一个线程呢?但是就像前面说的,单线程简化了很多问题,使得代码逻辑变得简单,写法符合直觉。
  4. asyncio 模块在单线程上启动一个事件循环(event loop),时刻监听新进入循环的事件,加以处理,并不断重复这个过程,直到异步任务结束。事件循环的内部机制,可以参考 JavaScript 的模型 ,两者是一样的。
  5. 总结:
    • 最关键的:其实底层只有一个线程,多个任务分享运行时间
    • 让我不经思考,程序本身就是串行执行的,异步编程也是串行执行。也就说,所谓的异步编程是可以直接转化为串行的程序的
    • 那么,异步编程的意义是什么❓
      • 编程单元,这个概念是我自己编的,意思是虽然我们正常的程序就可以完成异步编程的工作,但是使用异步编程之后,我们还可以保证依然是已函数为我们编程的单元,使代码更加调理,自己编程的时候也更容易将复杂功能抽象模块化