Advertisement

python是多线程还是单线程_Python 多线程和单线程本质应用区别

阅读量:

先了解下CPU的简单运行原理:

该处理器具备卓越的性能,在单秒时间内即可完成数千次运算;其独特的架构允许将时间段划分为无数个极小的时间片;这种设计使得同一处理器仅能处理单个任务;然而通过智能调度机制可轮流处理多个任务:在前一时间片完成A任务后迅速切换至B任务进行处理,在如此微小的时间片切换下给人一种仿佛并行计算的效果

再了解下单线程和多线程的区别:

首先了解下单进程的概念, 简单来说它类似于一条通道, 典型的单向通道设置, 每次只能处理一个请求. 而多进程中设有多个通道, 能够并行处理多个请求. 那么单线程与多线程在实际运行中的区别是什么呢? 由于每个进程中只有一个线程处于执行状态, 因此它们无法真正意义上的并行运行. 尽管 CPU 能够快速切换并行处理多个任务, 但这种切换的时间间隔非常短暂, 在毫秒或微秒级别, 因此从用户感知上两者并无明显差异. 实际上它们是在同一时间内各自独立地完成各自的任务.

接着就产生了单线程和多线程的疑惑:

如前所述,在计算机领域中,并非所有多线程都是在同一时间点上并发执行的;而CPU则是按照一定的规划依次执行各个独立的多线程任务。那么这种技术的作用体现在哪里呢?举个例子,在Python编程环境中,默认情况下连续多次调用同一个函数会被视为一个单线程的过程;而如果将这些调用分散到不同的CPU核心上作为独立的任务运行,则被视为一个多线程的操作。然而根据上述理论分析,在这种情况下CPU的实际运行时间并不会得到缩短;因为即使采用多核处理的方式进行任务分配与调度管理也是需要消耗一定的时间成本的。因此事实证明这种做法并不会带来预期中的性能提升效果;反而是会因为资源调度等操作而消耗更多的时间资源。这或许就是很多人在实际应用中发现使用过多核或多线程会导致性能下降的根本原因所在吧!

这里需要了解下GIL:

作为一种解释性编程语言,Python在其执行过程中必须依赖于内置的解释器来解码和处理代码指令。简述GIL的作用机制时可知:这意味着Python程序在执行时会通过全局解释器锁(GIL)来协调资源。具体来说,在运行期间只能有一个线程同时执行代码段以确保资源的有效利用;每个线程必须先获取当前的GIL才能开始执行代码,并在完成任务后将其释放以便其他线程继续使用。

设置GIL -> 切换到一个线程去执行 -> 运行 -> 把线程设置为睡眠状态 -> 解锁GIL

然后再次重复以上步骤。

IO密集型任务多线程比单线程要快太多:

看起来多线程在耗能方面超过单线程。然而,在处理速度上却反而没有加快甚至有所减缓。这种现象主要发生在那些需要大量计算的任务中(就如那些需要进行大量运算的任务而言),例如计算圆周率或对视频进行高清解码等操作都需要依赖于强大的CPU运算能力。在这种情况下,在Python中使用多线程并不会提高效率甚至可能因为同步机制(如GIL)的存在而使效率进一步降低。

另一种典型的IO密集型任务是那些涉及网络和磁盘I/O的操作。这类任务的特点是CPU使用率较低,在大部分时间里都用于等待I/O操作完成(因为I/O操作的速度远低于CPU及内存的速度)。具体而言,在99%的时间内都用于执行I/O操作,在剩余的时间里仅占用约1%的 CPU 时间。

我也无意中产生了关于爬虫的想法。我也知道爬虫通常被视为需要大量I/O操作的任务,在使用多线程发送请求的情况下,在实际运行中发现了一个有趣的问题:在使用多线程发送请求的情况下,并非所有资源都得到了充分优化利用。具体来说,在每次向服务器发出一个新请求之后都需要等待 server 返回 response 数据包,并且在这一等待的过程中会释放 GIL 锁以便其他 thread 可以继续向 server 发送新的 request 请求。按照这个流程进行下去直到所有的 request 都被成功发送完毕——这其实意味着 CPU 几乎同时完成了多个 request 的发送过程。相比之下如果采用单 thread 模式则必须遵循不同的工作流程:单 thread 模式下,在发送完一个 request 后必须等待 server 返回 response 数据包之后才会释放 GIL 锁以便处理下一个 request 请求——显然在这种模式下每个 thread 都能高效地处理多个 并发 请求而不会出现排队现象。因此可以看出采用多 thread 模式相比单 thread 模式在性能上有明显提升

综上所述:

当处理计算密集型的任务时

在应对高度IO密集的任务场景时,在Python中采用多线程比单线程串并行的方式运行更能发挥其优势;相比单线程而言,在性能上有显著提升。

全部评论 (0)

还没有任何评论哟~