进程与线程
学习路线和学习重点
1. 学习路线
-
基础概念
- 理解进程和线程的基本概念。
- 学习操作系统中进程和线程的管理机制。
- 理解Python中的GIL及其影响。
-
基本操作
- 学习如何创建、启动、终止线程和进程。
- 理解线程和进程的生命周期及其状态转换。
-
线程编程
- 学习
threading
模块中的基本用法。 - 理解线程同步和互斥(锁、信号量、条件变量)。
- 学习线程间通信(事件、队列)。
- 学习
-
进程编程
- 学习
multiprocessing
模块中的基本用法。 - 理解进程间通信(队列、管道、共享内存)。
- 学习使用管理器共享复杂数据。
- 学习
-
高级应用
- 学习线程和进程池的使用。
- 理解并发编程中的性能调优和问题排查。
- 实践并发编程的设计模式和最佳实践。
-
项目实践
- 结合实际项目进行线程和进程编程。
- 学习如何调试并优化多线程和多进程程序。
2. 学习重点
线程编程
-
线程创建与管理
- 使用
threading.Thread
创建和启动线程。 - 使用
join()
方法等待线程完成。 - 理解线程的生命周期。
- 使用
-
线程同步
- 使用
threading.Lock
确保线程安全。 - 理解
RLock
、Semaphore
、Condition
等同步机制。 - 使用
threading.Event
实现线程间通信。
- 使用
-
线程池
- 使用
concurrent.futures.ThreadPoolExecutor
管理线程池。 - 提交任务并获取结果。
- 使用
-
实战练习
- 编写一个简单的多线程爬虫。
- 实现一个多线程的生产者-消费者模型。
进程编程
-
进程创建与管理
- 使用
multiprocessing.Process
创建和启动进程。 - 使用
join()
方法等待进程完成。 - 理解进程的生命周期。
- 使用
-
进程间通信
- 使用
multiprocessing.Queue
在进程间传递数据。 - 使用
multiprocessing.Pipe
实现双向通信。 - 使用
multiprocessing.Value
和multiprocessing.Array
共享数据。
- 使用
-
进程池
- 使用
concurrent.futures.ProcessPoolExecutor
管理进程池。 - 提交任务并获取结果。
- 使用
-
实战练习
- 实现一个多进程的矩阵计算任务。
- 编写一个多进程的数据处理管道。
线程(Thread)
1. 线程基础
-
线程(Thread):
- 线程是进程中的一个执行单元,能够与其他线程共享进程的内存和资源。
- 在同一个进程内,可以有多个线程同时执行,每个线程有自己的运行栈和程序计数器。
-
GIL(Global Interpreter Lock):
- Python解释器中的全局解释器锁,确保在任意时刻只有一个线程在执行Python字节码,限制了多线程在多核CPU上的并行执行。
- 虽然GIL限制了Python在多核CPU上的性能提升,但对于I/O密集型任务,多线程仍然能够提高性能。
2. threading
模块
-
创建线程:
- 使用
threading.Thread
类创建线程,可以通过传入目标函数和参数来启动线程。 - 线程对象的
start()
方法启动线程,join()
方法等待线程完成。
import threading def worker(): print("Thread is working") thread = threading.Thread(target=worker) thread.start() thread.join()
- 使用
-
线程类继承:
- 通过继承
threading.Thread
类创建线程,重写run()
方法定义线程的执行逻辑。
import threading class MyThread(threading.Thread): def run(self): print("Thread is working") thread = MyThread() thread.start() thread.join()
- 通过继承
-
线程同步:
- 锁(Lock):使用
threading.Lock
确保一次只有一个线程可以访问某个资源。 - 条件变量(Condition):使用
threading.Condition
实现线程之间的复杂同步。 - 事件(Event):使用
threading.Event
实现线程之间的简单通信。
import threading lock = threading.Lock() counter = 0 def increment(): global counter with lock: counter += 1 threads = [threading.Thread(target=increment) for _ in range(10)] for thread in threads: thread.start() for thread in threads: thread.join() print(counter)
- 锁(Lock):使用
3. 学习资源
进程(Process)
1. 进程基础
-
进程(Process):
- 进程是操作系统分配资源的基本单位,每个进程有独立的内存空间。
- 进程间通信(IPC)通过管道、消息队列、共享内存等方式实现。
-
进程生命周期:
- 进程在运行中经历新建、就绪、运行、阻塞和终止等状态。
- 进程的切换由操作系统调度器控制,确保系统资源的合理分配。
2. multiprocessing
模块
-
创建进程:
- 使用
multiprocessing.Process
类创建进程,可以通过传入目标函数和参数来启动进程。 - 进程对象的
start()
方法启动进程,join()
方法等待进程完成。
import multiprocessing def worker(): print("Process is working") process = multiprocessing.Process(target=worker) process.start() process.join()
- 使用
-
进程间通信:
- 队列(Queue):使用
multiprocessing.Queue
在进程间传递数据。 - 管道(Pipe):使用
multiprocessing.Pipe
提供双向通信通道。
import multiprocessing def worker(queue): queue.put("Data from process") queue = multiprocessing.Queue() process = multiprocessing.Process(target=worker, args=(queue,)) process.start() process.join() print(queue.get())
- 队列(Queue):使用
-
共享数据:
- 共享内存:
multiprocessing.Value
和multiprocessing.Array
用于在进程间共享数据。 - 管理器(Manager):
multiprocessing.Manager
提供更高层次的数据共享和同步。
import multiprocessing def worker(shared_counter): with shared_counter.get_lock(): shared_counter.value += 1 counter = multiprocessing.Value('i', 0) processes = [multiprocessing.Process(target=worker, args=(counter,)) for _ in range(10)] for process in processes: process.start() for process in processes: process.join() print(counter.value)
- 共享内存:
3. 学习资源
线程与进程的区别与使用场景
线程(Thread)
-
优点:
- 线程创建和销毁的开销较小。
- 线程之间可以共享内存,数据传递快。
- 适用于I/O密集型任务,如文件读写、网络请求等。
-
缺点:
- 受限于GIL,无法在多核CPU上实现真正的并行计算。
- 多线程编程容易出现竞争条件、死锁等问题。
进程(Process)
-
优点:
- 进程拥有独立的内存空间,安全性高。
- 适用于CPU密集型任务,能够充分利用多核CPU的性能。
- 不受GIL的限制,支持真正的并行计算。
-
缺点:
- 进程创建和销毁的开销较大。
- 进程间通信(IPC)相对复杂,数据传递速度较慢。