05-1 多路加速,了解多线程基本原理
2021/6/12 18:22:14
本文主要是介绍05-1 多路加速,了解多线程基本原理,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
你好,我是悦创。
❝不理解的地方可以去我博客留言噢,或者公众号后台回复数字“3”加小编(记得备注来意)拉你入交流群!
❞
我们知道,在一台计算机中,我们可以同时打开许多软件,比如同时浏览网页、听音乐、打字等等,看似非常正常。但仔细想想,为什么计算机可以做到这么多软件同时运行呢?这就涉及到计算机中的两个重要概念:多进程和多线程了。
同样,在编写爬虫程序的时候,为了提高爬取效率,我们可能想同时运行多个爬虫任务。这里同样需要涉及多进程和多线程的知识。
本课时,我们就先来了解一下多线程的基本原理,以及在 Python 中如何实现多线程。
1. 全局解释器锁
❝「全局解释器锁」 (英语:Global Interpreter Lock,缩写 「GIL」)
是 「计算机程序设计语言解释器」 用于 「同步线程」 的一种机制,它使得任何时刻仅有 「一个线程」 在执行,即便在 「多核心处理器」 上,使用 「GIL」 的解释器也只允许同一时间执行一个线程。常见的使用 「GIL」 的解释器有 「CPython」 与 「Ruby MRI」。
❞
如果,你对上面的不理解,也没有问题。通俗的解释就是:你电脑是 「一核或者多核」 ,还是你的代码写了了多个线程,但因为 「GIL」 锁的存在你也就只能运行一个线程,无法同时运行多个线程。
接下来,我们来用个图片来解释一下:
![watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=](/upload/202106/12/202106121822106889.png)
比如图中,假如你开了两个线程(「Py thread1」 、「Py tread2」),
- 当我们线程一(「Py thread1」)开始执行时,这个线程会去我们的解释器中申请到一个锁。也就是我们的 「GIL」 锁;
- 然后,解释器接收到一个请求的时候呢,它就会到我们的 「OS」 里面,申请我们的系统线程;
- 系统统一你的线程执行的时候,就会在你的 「CPU」 上面执行。(假设你现在是四核CPU);
- 而我们的另一个线程二(「py thread2」)也在同步运行。
- 而线程二在向这个解释器申请 「GIL」 的时候线程二会卡在这里(Python 解释器),因为它的 「GIL」 锁已经被线程一给拿走了(也就是说:他要进去执行,必须拿到这把锁);
- 线程二要运行的话,就必须等我们的线程一运行完成之后(也就是把我们的 「GIL」 释放之后(图片中的第5步)线程二才能拿到这把锁);
- 当线程二拿到这把锁之后就和线程一的运行过程一样。
① Create > ② GIL > ③ 申请原生线程(OS) > ④ CPU 执行(如果有其他线程,都会卡在 Python 解释器的外边)
这个锁其实是 Python 之父想一劳永逸解决线程的安全问题(也就是禁止多线程同时运行)
![watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=](/upload/202106/12/202106121822114916.png)
![watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=](/upload/202106/12/202106121822123154.png)
![watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=](/upload/202106/12/202106121822145195.png)
这篇关于05-1 多路加速,了解多线程基本原理的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-06-26结对编程到底难不难?答案在这里
- 2024-06-19《2023版Java工程师》课程升级公告
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)