File tree Expand file tree Collapse file tree 1 file changed +22
-2
lines changed
docs/docs/选择编程语言/Python/Python模块库 Expand file tree Collapse file tree 1 file changed +22
-2
lines changed Original file line number Diff line number Diff line change @@ -142,6 +142,26 @@ Python 的标准库提供了两个模块:\_thread 和 threading,\_thread 是
142142
143143[ threading] ( https://docs.python.org/zh-cn/3.10/library/threading.html?highlight=threading#module-threading ) :Threading Multiprocessing Module Code Documentation
144144
145+ :::tip
146+ 为什么多线程没有使用更多的资源,但是比单线程更快?
147+
148+ 多线程的出现,核心目的是为了最大限度地利用中央处理器(CPU)这一关键硬件资源。
149+
150+ 以一个常见的爬虫任务为例,其工作流程可以分为两个主要步骤:
151+ 1 . CPU指挥网卡发送网络请求,这一过程往往需要等待远程服务器响应(例如,网络通信耗时1秒)。
152+ 2 . CPU指挥磁盘将接收到的数据写入磁盘,完成持久化存储(例如,磁盘耗时19秒)。
153+
154+
155+ * ** 单线程模式** :在单线程下处理10个网址,程序必须顺序执行。当第一个网址的网络请求发送后,程序会进入** 等待状态** ,直到数据完全写入磁盘(总耗时20秒)后,才能开始处理第二个网址。因此,处理10个网址的总耗时将是 $10 \times 20$ 秒,即200秒。CPU长时间闲置。
156+
157+ * ** 多线程模式** :多线程则能显著提高效率。当第一个线程发出网络请求后,CPU不再闲置等待,而是立即切换到第二个线程,发起新的网络请求。这样,CPU可以** 在等待I/O操作(如网络响应和磁盘写入)完成的同时,处理其他任务** 。通过这种方式,CPU最大程度不空闲,指挥多个网络请求和磁盘写入操作** 并行进行** ,从而大幅缩短总体的完成时间。
158+
159+ 这个切换过程称之为** 上下文切换** ,会产生一定的开销,由操作系统自动完成,操作系统不一定在最合理的时间点进行上下文切换。
160+
161+ 因此为了进一步提高效率,我们使用协程来完成这个任务。在协程中,程序员在代码中编写` await ` 关键字来完成主动** 上下文切换** 。
162+ :::
163+
164+
145165#### 多线程
146166
147167``` python showLineNumbers
@@ -317,9 +337,9 @@ if __name__ == '__main__':
317337
318338** Python 的多线程并不能发挥 CPU 的多核特性** ,这一点只要启动几个执行死循环的线程就可以得到证实了。
319339
320- 之所以如此,是因为 Python 的解释器有一个“全局解释器锁”(GIL)的东西,任何线程执行前必须先获得 GIL 锁,然后每执行 100 条字节码,解释器就自动释放 GIL 锁,让别的线程有机会执行,新版Python已经移除了GIL。
321-
340+ 之所以如此,是因为 Python 的解释器有一个“全局解释器锁”(GIL)的东西,任何线程执行前必须先获得 GIL 锁,然后每执行 100 条字节码,解释器就自动释放 GIL 锁,让别的线程有机会执行。
322341
342+ 好在Python3.13已经支持在禁用 GIL 的情况下运行。
323343
324344### asyncio 模块
325345
You can’t perform that action at this time.
0 commit comments