pin_drop当前位置:知识文库 ❯ 图文

Python进程与线程概念详解 - 并发与并行入门指南

概述

进程与线程是操作系统中两个核心的并发概念。进程是资源分配的基本单位,线程是CPU调度的基本单位。理解两者的区别与联系,是学习Python多线程与多进程编程的基础。


进程与线程对比

对比项 进程 线程
定义 资源分配的最小单位 CPU调度的最小单位
内存空间 独立的内存空间 共享所属进程的内存空间
创建开销 开销大 开销小
通信方式 进程间通信(IPC) 直接读写共享内存
安全性 相互隔离,更安全 共享数据,需要同步机制
切换速度 较慢 较快

并发与并行

并发(Concurrency)

并发是指多个任务在同一时间段内交替执行。在单核CPU上,通过时间片轮转的方式,让多个任务轮流使用CPU,从宏观上看像是同时执行,但微观上是交替执行。

并行(Parallelism)

并行是指多个任务在同一时刻真正同时执行。需要多核CPU的支持,每个核心可以同时执行一个任务。

代码示例

# 并发与并行的直观理解
import threading
import multiprocessing
import time

def task(name, delay):
    """任务函数"""
    print(f"任务 {name} 开始")
    time.sleep(delay)
    print(f"任务 {name} 结束")

# 并发执行(线程)- 适合IO密集型任务
t1 = threading.Thread(target=task, args=("A", 1))
t2 = threading.Thread(target=task, args=("B", 1))
t1.start()
t2.start()
t1.join()
t2.join()

# 并行执行(进程)- 适合CPU密集型任务
p1 = multiprocessing.Process(target=task, args=("C", 1))
p2 = multiprocessing.Process(target=task, args=("D", 1))
p1.start()
p2.start()
p1.join()
p2.join()

Python中的进程与线程

Python通过标准库提供了对进程和线程的支持:threading 模块用于线程操作,multiprocessing 模块用于进程操作。

代码示例

# Python中创建线程示例
import threading

def worker(num):
    """线程工作函数"""
    print(f"线程 {num} 正在运行")

# 创建并启动线程
threads = []
for i in range(5):
    t = threading.Thread(target=worker, args=(i,))
    threads.append(t)
    t.start()

# 等待所有线程完成
for t in threads:
    t.join()

print("所有线程执行完毕")

代码示例

# Python中创建进程示例
import multiprocessing

def worker(num):
    """进程工作函数"""
    print(f"进程 {num} 正在运行")

if __name__ == '__main__':
    processes = []
    for i in range(5):
        p = multiprocessing.Process(target=worker, args=(i,))
        processes.append(p)
        p.start()
    
    for p in processes:
        p.join()
    
    print("所有进程执行完毕")

适用场景

  • IO密集型任务:使用多线程,如网络请求、文件读写、数据库查询等

  • CPU密集型任务:使用多进程,如数值计算、图像处理、数据分析等

  • 混合型任务:结合使用多进程和多线程,发挥各自优势

  • 异步任务:使用asyncio处理大量并发IO操作


注意事项

注意1:Python的GIL(全局解释器锁)限制了同一时刻只能有一个线程执行Python字节码,因此多线程不适合CPU密集型任务。

注意2:多线程共享内存空间,访问共享资源时必须使用锁机制,避免数据竞争和不一致。

注意3:多进程虽然可以绕过GIL限制,但进程间通信开销较大,应根据实际需求选择合适的并发方式。


小结

  • 进程是资源分配的基本单位,拥有独立的内存空间

  • 线程是CPU调度的基本单位,共享所属进程的内存空间

  • 并发是交替执行,并行是同时执行

  • IO密集型用多线程,CPU密集型用多进程


练习题

练习1

编写程序,分别使用线程和进程执行相同的计算任务,比较两者的执行时间和资源占用情况。

练习2

编写一个程序,模拟IO密集型任务(如下载多个网页),使用多线程实现并发下载,并统计总耗时。

常见问题

1. Python中什么时候用多线程,什么时候用多进程?

IO密集型任务(网络请求、文件读写)适合用多线程,CPU密集型任务(数值计算、图像处理)适合用多进程。这是因为Python的GIL限制了多线程在CPU密集型任务上的并行能力。

2. 什么是GIL?它对多线程有什么影响?

GIL(全局解释器锁)是Python解释器中的一个互斥锁,它确保同一时刻只有一个线程执行Python字节码。这意味着即使在多核CPU上,Python的多线程也无法实现真正的并行执行,只能实现并发。

3. 进程间通信有哪些方式?

进程间通信(IPC)的方式包括:管道(Pipe)、消息队列(Queue)、共享内存、信号量(Semaphore)、套接字(Socket)等。Python的multiprocessing模块提供了Queue和Pipe等便捷的IPC机制。

4. 为什么多线程比多进程更节省资源?

线程共享所属进程的内存空间,创建线程时不需要分配新的内存空间,只需要分配栈空间和寄存器状态。而进程需要独立的内存空间,创建进程时需要复制父进程的内存空间,开销较大。

标签: 进程与线程 并发编程 并行计算 GIL Python并发

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Python smtplib邮件发送教程 - 附件与HTML邮件实战 下一篇: Python threading模块详解 - 线程创建与管理入门

poll相关推荐