博客
关于我
Python 中多线程与多处理之间的区别
阅读量:795 次
发布时间: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 | pyqtgraph,一个神奇的 Python 库!
查看>>
python读取文本文件数据
查看>>
python | Python mock对象与测试替身
查看>>
python | Python pandas实现数据追加和合并的最佳方法
查看>>
python | Python 中检查一个数字是否是三态数
查看>>
python | Python 蒙特卡洛模拟
查看>>
python | python-docx,一个超厉害的 Python 库!
查看>>
python | Python中使用@property装饰器
查看>>
python | Python中的functools模块高级应用
查看>>
python | Python中的itertools模块使用技巧
查看>>
python | Python中的事件驱动编程模型
查看>>
python | Python中的内存池与缓存机制
查看>>
python | Python中的弱引用与内存管理
查看>>
python | Python中的类多态:方法重写和动态绑定
查看>>
python | Python作用域链查找机制
查看>>
python | Python俄罗斯方块游戏详解
查看>>
python | Python动态代码执行:exec和compile函数
查看>>
Python读取文件数据进行数据图形化展示
查看>>
python | Python反向迭代:reversed实现机制
查看>>
python | Python开发必知的数据容器用法(建议收藏!)
查看>>