"Python-20-多线程.md" 在Python编程中,多线程是一种常见的并发执行机制,允许程序同时处理多个任务。多线程对于轻量级的多任务处理非常有效,如网络数据传输、文件读写以及数据库交互等。然而,由于Python的实现方式,多线程并不意味着能充分利用多核CPU资源。这主要是因为Python的解释器,CPython,使用了全局解释器锁(GIL)。 GIL是Python解释器为了同步对解释器级别的数据访问而引入的一个机制。它确保在任何时刻只有一个线程在执行Python字节码。GIL的工作流程大致如下: 1. 设置一个GIL锁。 2. 各个线程竞争获取CPU资源,假设线程1成功获得。 3. 在GIL保护下,线程1执行Python字节码。执行过程中可能出现两种情况: - 被动释放:由于CPU的时间片轮转,线程1会被迫休眠,GIL随之释放。 - 主动释放:线程1通过`time.sleep()`或`threading.yield()`主动让出执行权。 4. 其他线程有机会获取GIL并继续执行。 5. 这个过程持续进行,直到程序结束。 Python中创建线程的步骤可以通过`threading`模块完成。以下是一个简单的例子: ```python import threading def function_to_run(): # 函数体 new_thread = threading.Thread(target=function_to_run) new_thread.start() ``` 在这个例子中,`target`参数指定线程要执行的函数,`args`和`kwargs`则用于传递函数所需的参数。 例如,如果我们要创建两个线程,一个唱歌,一个跳舞,代码可以这样编写: ```python import threading import time def sing(n): for _ in range(n): print('sing') time.sleep(0.2) def dance(n): for _ in range(n): print('dance') time.sleep(0.2) if __name__ == '__main__': t1 = threading.Thread(target=sing, args=(5,)) t2 = threading.Thread(target=dance, args=(5,)) t1.start() t2.start() ``` 这里,`t1`和`t2`分别代表两个线程,它们分别调用`sing`和`dance`函数,并传入参数。 当我们需要在线程中传递参数时,可以将参数列表放入`args`元组,关键字参数放入`kwargs`字典中,如下所示: ```python def demo_01(name, age): print(name, age) if __name__ == '__main__': t1 = threading.Thread(target=demo_01, args=('zhangsan',), kwargs={'age': 18}) t1.start() ``` 关于线程的执行顺序,应当注意的是,线程的启动顺序是确定的,但它们的执行顺序则是不确定的。这是因为线程的执行取决于CPU调度,而不是程序员的控制。这意味着在多线程环境中,不能保证某个特定的线程会先于其他线程执行完毕。 Python的多线程提供了在单个CPU核心上并发执行任务的能力,但由于GIL的存在,它并不适合CPU密集型的任务。相反,多线程更适合于I/O密集型任务,其中大部分时间都在等待数据的读写,而非执行计算。对于CPU密集型任务,可以考虑使用多进程,通过`multiprocessing`模块实现,以便利用多核CPU的优势。
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![gz](https://img-home.csdnimg.cn/images/20210720083447.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/default.jpg!1)
- 粉丝: 0
- 资源: 4
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- 解决本地连接丢失无法上网的问题
- BIOS报警声音解析:故障原因与解决方法
- 广义均值移动跟踪算法在视频目标跟踪中的应用研究
- C++Builder快捷键大全:高效编程的秘密武器
- 网页制作入门:常用代码详解
- TX2440A开发板网络远程监控系统移植教程:易搭建与通用解决方案
- WebLogic10虚拟内存配置详解与优化技巧
- C#网络编程深度解析:Socket基础与应用
- 掌握Struts1:Java MVC轻量级框架详解
- 20个必备CSS代码段提升Web开发效率
- CSS样式大全:字体、文本、列表样式详解
- Proteus元件库大全:从基础到高级组件
- 74HC08芯片:高速CMOS四输入与门详细资料
- C#获取当前路径的多种方法详解
- 修复MySQL乱码问题:设置字符集为GB2312
- C语言的诞生与演进:从汇编到系统编程的革命
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)