1.4 多线程与多进程
1.4.1 多线程
多线程一般指通过技术手段在具体项目中开启两个或两个以上线程,以一起执行任务。在Python中也是如此,我们可以通过Python提供的线程相关的类库在Python项目中开启多线程,比如使用Threading库等方式,这一点会在本书的高并发篇进行详细介绍。通过开启两个或两个以上线程,计算机可以异步或并发执行Python任务。通过该技术手段,Python任务得到充分执行,可以使CPU可以充分地发挥作用,不再因为等待任务的执行而延长CPU等待执行任务的时间。
1.4.2 多进程
多进程一般指通过技术手段,将同一个项目拆分成不同的进程来一起运行项目的现象。这种技术目前只有一些理论内容,并没有实际的产出,因为这种理论在正常情况下实现起来还是有一定难度的,所以本书不做过多介绍。
1.4.3 单线程
单线程指的是项目自始至终只有一个线程负责执行任务。这种单线程执行任务的方式在比较简单的场景中比较适用,但是,一旦项目具备一定的业务逻辑或者有计算要求,再采用单线程的方式去处理任务就不是很合适了。试想一下,一个线程正在执行一个比较耗时的计算任务,而后续代码需要这个计算任务的结果才能继续向下执行。此时,由于只有一个线程执行,所以不得不等待该线程执行完后才能继续执行后续的业务逻辑,这一等待过程会直接反映到用户层面,即用户在使用该项目时会感知到明显的等待时间,这会给用户带来不好的体验。
为了避免上述现象出现,我们不得不在项目中采用多线程的方式进行优化,但是,使用多线程来对项目进行优化就一定好吗?
1.4.4 多线程的优势与不足
任何事物都具有两面性,多线程亦是如此。在通过多线程来优化项目时,我们不得不反思使用多线程会不会给项目增加其他的负担。答案是一定会。
对于CPython虚拟机来说,多线程是通过切换线程上下文而实现的。而每一次线程上下文切换,都会带来一定的时间开销,都需要CPython虚拟机去等待执行,这也是使用多线程处理任务必须要花费的时间成本。除了时间成本,在Python项目中将具体代码优化成线程安全的常用手段还是加锁,而一旦给代码解锁,就会带来线程间对于临界区资源的竞争,一旦存在资源的竞争,线程之间就会等待获取锁,从而获取线程所需的资源,这其中也需要一定的时间成本。如果开发者不懂如何给代码加锁,从而乱用各种锁,这对于代码本身就不是一件正常的事情,大概率也不会实现线程安全,只会让结果变得更糟。
综上所述,我们只有在具备一定的多线程应用能力之后,才能对Python代码进行优化,这样才能发挥多线程的优势。而实现多线程的每一种技术手段都需要读者潜心钻研、自我总结。