博客
关于我
Python 中多线程与多处理之间的区别
阅读量:797 次
发布时间:2023-03-06

本文共 1651 字,大约阅读时间需要 5 分钟。

说明

本文旨在探讨Python中的多线程和多处理技术及其适用场景。为了更好地理解这些概念,我们将从基础知识入手,逐步深入学习代码实现。


基本术语和概念

程序可以被视为一组执行特定任务的指令集合,通常存储在计算机的硬盘上。进程则是指已加载到内存中的可执行文件,它包含所有运行所需的资源,并拥有独立的内存空间。线程则是进程中的执行单元,多个线程可以共享进程的内存空间并在同一进程内并发运行。

多线程技术允许进程生成多个线程,通过并发执行不同的任务来提高效率。然而,Python中的全局解释器锁(GIL)会阻止线程同时运行,导致并行执行的效果不如其他语言。多处理技术则通过在多个进程之间分配任务,实现真正的并行性。每个进程都有自己的内存空间和Python解释器实例,从而避免资源冲突。


进程对CPU绑定的任务执行

1. 一个接一个地运行 IO 绑定任务两次

我们将调用io_bound函数两次,每次执行需要10秒。由于同一进程内的线程是串行执行的,整个程序将耗时20秒。

import osfrom multiprocessing import ProcessCOUNT = 200000000SLEEP = 10def io_bound(sec):    pid = os.getpid()    print(f"PID: {pid}")    print(f"Process name: {os.getpid()}")    print(f"Thread name: {current_thread().name}")    print(f"---> Start sleeping...")    time.sleep(sec)    print(f"---> Finished sleeping...")

2. 使用线程运行受 IO 绑定的任务

通过使用多线程,我们可以并行执行两个io_bound函数。每个线程占用同一进程内的资源,但通过并行执行显著缩短总执行时间。

from threading import Threaddef io_bound(sec):    print(f"---> Start sleeping...")time.sleep(SLEEP)print(f"---> Finished sleeping...")

3. 一个接一个地运行两次 CPU 绑定任务

CPU绑定任务需要更多资源,同一进程内的线程执行会导致资源竞争和性能瓶颈。

def cpu_bound(n):    print(f"---> Start counting...")    while n > 0:        n -= 1    print(f"---> Finished counting...")

4. 使用线程运行受 CPU 绑定的任务

尽管多线程可以并行执行任务,但由于GIL的限制,线程间的资源竞争会导致性能下降。对于CPU密集型任务,线程不如进程效果好。

5. 使用多处理实现 CPU 绑定的任务

通过启动多个进程,我们可以利用多个CPU核同时执行任务。每个进程独立运行,资源不再互相竞争,整体性能得到显著提升。

from multiprocessing import Processdef cpu_bound(n):    print(f"---> Start counting...")    while n > 0:        n -= 1    print(f"---> Finished counting...")

6. 使用多处理运行 IO 绑定的任务

虽然多处理可以实现并行性,但 IO 绑定的任务通常不占用 CPU 资源,因此多处理的优势不如多线程明显。线程是优先选择的方案。


结论

  • IO绑定任务:多线程是更优的选择。
  • CPU密集型任务:多处理提供了更好的并行性能。

通过对比多线程和多处理的特点,我们可以更好地理解两者的适用场景,并在实际开发中做出更合适的选择。

转载地址:http://ufofk.baihongyu.com/

你可能感兴趣的文章
Python 列表解析 大文件
查看>>
python 列表转字典方法
查看>>
Python 列表(List)概述-ChatGPT4o作答
查看>>
Python网络爬虫基础进阶到实战教程
查看>>
Python 初学者需要知道的四条建议
查看>>
Python 判断字符串是否包含子字符串
查看>>
python 判断当前时间是否为零点
查看>>
python 利用pandas读取本地中CSV文件的指定列 列名重命名 并保存回本地
查看>>
python 利用pyspark读取HDFS中CSV文件的指定列 列名重命名 并保存回HDFS
查看>>
python 利用pyttsx3文字转语音
查看>>
python 利用已有Ner模型进行数据清洗合并
查看>>
python 到大数据开发工程师_如何成为一个大数据开发工程师?
查看>>
python 加密解密(base64, AES)
查看>>
Python 包管理器和 Node.js
查看>>
python 启动提示IDLE's subprocess didn't make conne...
查看>>
Python 和 OpenCV.如何检测图像中的所有(填充)圆形/圆形对象?
查看>>
Python 和 RabbitMQ - 聆听来自多个渠道的消费事件的最佳方式?
查看>>
python编辑器打不开_关于命令ride.py打不开RF,而是打开pycharm编辑器问题解决思路...
查看>>
python编译exe同时支持32位_第三周:同时管理64位和32位版本的Python,并用Pyinstaller打包成exe...
查看>>
Python 和Java 哪个更适合做自动化测试?
查看>>