Skip to content

Commit 6bdba64

Browse files
📝 更新文档,增强多线程和协程内容
- 新增了多线程效率的解释,详细说明了单线程与多线程在处理I/O操作时的区别,提升了文档的实用性。 - 增加了关于上下文切换的概念及其开销的讨论,帮助用户更好地理解多线程的工作原理。 - 更新了关于全局解释器锁(GIL)的说明,指出Python3.13对GIL的支持情况,增强了文档的准确性和指导性。 - 优化了内容结构,确保信息更加清晰和易于理解。
1 parent 2246289 commit 6bdba64

File tree

1 file changed

+22
-2
lines changed
  • docs/docs/选择编程语言/Python/Python模块库

1 file changed

+22
-2
lines changed

docs/docs/选择编程语言/Python/Python模块库/并发.mdx

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff 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

0 commit comments

Comments
 (0)