目录

专业学习多线程多进程多协程加速程序运行

专业学习|多线程、多进程、多协程加速程序运行

学习资料来源:

若有侵权,联系删除。

一、程序的提速方法——多线程、多进程、多协程

在现代编程中,多线程、多进程和多协程是三种常见的程序提速方法。它们都可以用来提高程序的并发性和效率,但各有不同的特点和适用场景。

https://i-blog.csdnimg.cn/direct/9063f5b5546141f9827053899321edcd.png

二、怎样选择多线程、多进程、多协程?

选择哪种模型主要取决于以下因素:

  1. 计算密集型 vs I/O 密集型

    • 多进程 :适用于计算密集型任务,因为可以充分利用多核 CPU 的计算能力。
    • 多线程 :适用于 I/O 密集型任务,因为线程切换的开销较小。
    • 多协程 :适用于高并发的 I/O 密集型任务,因为协程的切换开销比线程更小。
  2. 全局解释器锁(GIL)

    • 多线程 :在 Python 中,由于 GIL 的存在,多线程在 CPU 密集型任务上并不会真正并行。
    • 多进程 :可以绕过 GIL 的限制,适合 CPU 密集型任务。
    • 多协程 :协程本身并不能绕过 GIL,但可以通过异步 I/O 和事件循环来提高效率。
  3. 资源消耗

    • 多进程 :每个进程有独立的内存空间,资源消耗较大。
    • 多线程 :线程共享内存空间,资源消耗较小。
    • 多协程 :协程的资源消耗最小,适合高并发场景。

https://i-blog.csdnimg.cn/direct/6c8f59043e0041899a60bfa407c4f18e.png

https://i-blog.csdnimg.cn/direct/e80eb97e80ed42c598ae239405af49a7.png

https://i-blog.csdnimg.cn/direct/a97a1db0bf464b7487514ff4438e1d75.png

三关于多线程、多进程、多协程的一些基础知识

(一)全局解释器锁GIL

全局解释器锁(Global Interpreter Lock,GIL)是 Python 解释器为了保证线程安全而引入的一个机制。在任意时刻,只有一个线程可以执行 Python 字节码。这意味着在 Python 中,多线程并不能真正实现并行计算,尤其是在 CPU 密集型任务上。

https://i-blog.csdnimg.cn/direct/36d35ff49096434ab1d35301ca9cc974.png https://i-blog.csdnimg.cn/direct/f25d6bf5cf8a44e1847419feac353d3e.png

https://i-blog.csdnimg.cn/direct/d3032a3e164e431c921fc2a3e3f78f8e.png

https://i-blog.csdnimg.cn/direct/5c3609285eb04fd1a499bd596179f947.png

https://i-blog.csdnimg.cn/direct/fbe47faa3e5a4ce8884d11c8f26ab6e8.png

(二)利用多线程加速爬虫10倍

多线程在 I/O 密集型任务(如网络爬虫)中表现出色。通过使用多线程,可以在等待网络响应时切换到其他线程,从而提高程序的效率。线程池(ThreadPoolExecutor)可以方便地管理线程,避免线程过多导致的资源浪费。 https://i-blog.csdnimg.cn/direct/945ef5e6aee34dbda50755d08f13073d.png

https://i-blog.csdnimg.cn/direct/dc8de212c2bf4aaca28fe8b5ba8e5698.png

https://i-blog.csdnimg.cn/direct/a68dafa63b7c4a1bb668e115ad0dc639.png

https://i-blog.csdnimg.cn/direct/b9e2cff481e44930a04b800eb570a99a.png

https://i-blog.csdnimg.cn/direct/aab98b07190f4623adf859630d3f429e.png

https://i-blog.csdnimg.cn/direct/4b71ba4b33044ee983f616b8ba4764d0.png

(三)好用的线程池threadpoolexecutor

线程池(ThreadPoolExecutor)是一种高效的线程管理工具。它可以根据任务的数量动态调整线程的数量,避免创建过多的线程。使用线程池可以显著提高程序的性能,尤其是在处理大量 I/O 密集型任务时。

https://i-blog.csdnimg.cn/direct/fa87de0fd59a492fabf600eaccb023f4.png

https://i-blog.csdnimg.cn/direct/e90cb92ba5ed48018d12fd9d173e7ba4.png

四、使用多进程multiprocessing加速程序的运行

多进程(multiprocessing)模块可以创建多个进程,每个进程有独立的内存空间,可以充分利用多核 CPU 的计算能力。在 Python 中,由于 GIL 的存在,多进程是实现并行计算的常用方法。

https://i-blog.csdnimg.cn/direct/12eb411222af44aab5b2f190744638a2.png

https://i-blog.csdnimg.cn/direct/f5cd6f3533dc445daac4027c140c4035.png

https://i-blog.csdnimg.cn/direct/21a23449d49a4b9f8613f5a179287c70.png

https://i-blog.csdnimg.cn/direct/bafcb32bfe714064b44cb975ab51ce1e.png