pin_drop当前位置:知识文库 ❯ 图文
Python进程与线程概念详解 - 并发与并行入门指南
概述
进程与线程是操作系统中两个核心的并发概念。进程是资源分配的基本单位,线程是CPU调度的基本单位。理解两者的区别与联系,是学习Python多线程与多进程编程的基础。
进程与线程对比
并发与并行
并发(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. 为什么多线程比多进程更节省资源?
线程共享所属进程的内存空间,创建线程时不需要分配新的内存空间,只需要分配栈空间和寄存器状态。而进程需要独立的内存空间,创建进程时需要复制父进程的内存空间,开销较大。
本文涉及AI创作
内容由AI创作,请仔细甄别