本文共 1651 字,大约阅读时间需要 5 分钟。
本文旨在探讨Python中的多线程和多处理技术及其适用场景。为了更好地理解这些概念,我们将从基础知识入手,逐步深入学习代码实现。
程序可以被视为一组执行特定任务的指令集合,通常存储在计算机的硬盘上。进程则是指已加载到内存中的可执行文件,它包含所有运行所需的资源,并拥有独立的内存空间。线程则是进程中的执行单元,多个线程可以共享进程的内存空间并在同一进程内并发运行。
多线程技术允许进程生成多个线程,通过并发执行不同的任务来提高效率。然而,Python中的全局解释器锁(GIL)会阻止线程同时运行,导致并行执行的效果不如其他语言。多处理技术则通过在多个进程之间分配任务,实现真正的并行性。每个进程都有自己的内存空间和Python解释器实例,从而避免资源冲突。
我们将调用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...") 通过使用多线程,我们可以并行执行两个io_bound函数。每个线程占用同一进程内的资源,但通过并行执行显著缩短总执行时间。
from threading import Threaddef io_bound(sec): print(f"---> Start sleeping...")time.sleep(SLEEP)print(f"---> Finished sleeping...")
CPU绑定任务需要更多资源,同一进程内的线程执行会导致资源竞争和性能瓶颈。
def cpu_bound(n): print(f"---> Start counting...") while n > 0: n -= 1 print(f"---> Finished counting...")
尽管多线程可以并行执行任务,但由于GIL的限制,线程间的资源竞争会导致性能下降。对于CPU密集型任务,线程不如进程效果好。
通过启动多个进程,我们可以利用多个CPU核同时执行任务。每个进程独立运行,资源不再互相竞争,整体性能得到显著提升。
from multiprocessing import Processdef cpu_bound(n): print(f"---> Start counting...") while n > 0: n -= 1 print(f"---> Finished counting...")
虽然多处理可以实现并行性,但 IO 绑定的任务通常不占用 CPU 资源,因此多处理的优势不如多线程明显。线程是优先选择的方案。
通过对比多线程和多处理的特点,我们可以更好地理解两者的适用场景,并在实际开发中做出更合适的选择。
转载地址:http://ufofk.baihongyu.com/