下篇:Python 多任务编程入门(二)—— 进程同步、进程池与注意事项

张开发
2026/4/20 1:49:10 15 分钟阅读

分享文章

下篇:Python 多任务编程入门(二)—— 进程同步、进程池与注意事项
目录一、进程间的资源竞争与锁1. 进程锁Lock的作用2. 使用步骤3. 代码示例二、进程池高效管理大量子进程1.进程池的原理2. 核心方法3. 示例用进程池批量计算平方三、多进程编程的重要注意事项1. 全局变量不共享2. 主进程与子进程的结束顺序四、总结什么时候该用进程一、进程间的资源竞争与锁虽然进程之间默认不共享内存但当它们同时访问同一个外部资源如同一个文件、同一台打印机、同一个网络端口时仍然会产生冲突。例如两个进程同时向同一个文件写入数据可能会造成数据错乱。1. 进程锁Lock的作用锁就像一个门上的锁谁拿到钥匙谁就进去使用资源其他人只能在门外等待。这样就能保证同一时间只有一个进程操作共享资源。2. 使用步骤创建锁lock multiprocessing.Lock()在子进程中获取锁lock.acquire()如果锁已被占用当前进程会阻塞释放锁lock.release()通常放在finally中确保一定释放3. 代码示例import multiprocessing import time def task(lock, name): lock.acquire() try: print(f{name} 获得锁开始工作) time.sleep(1) print(f{name} 工作完成) finally: lock.release() if __name__ __main__: lock multiprocessing.Lock() p1 multiprocessing.Process(targettask, args(lock, 进程1)) p2 multiprocessing.Process(targettask, args(lock, 进程2)) p1.start() p2.start() # 进程1 获得锁开始工作 # 进程1 工作完成 # 进程2 获得锁开始工作 # 进程2 工作完成运行结果会看到两个进程不会同时打印“开始工作”而是先后执行。注意同一个进程内不能连续两次调用acquire()而不释放否则会导致死锁程序卡住。二、进程池高效管理大量子进程假如你要执行 100 个短小的任务每个任务只耗时 0.1 秒。如果为每个任务创建一个进程创建和销毁进程的开销可能远大于任务本身。这时进程池Pool是更优方案。1.进程池的原理进程池预先创建一批固定数量的子进程比如 4 个然后把任务丢给它们。一个任务完成后该进程并不销毁而是去执行下一个任务。这样可以避免频繁创建/销毁进程的代价。2. 核心方法Pool(processesn)创建进程池最多同时运行 n 个进程。apply_async(func, args, kwargs)异步提交任务推荐主进程不等待。map(func, iterable)批量提交类似内置map会阻塞直到全部完成。close()关闭进程池不再接受新任务。join()等待池中所有任务执行完毕。3. 示例用进程池批量计算平方import multiprocessing import os def square(x): print(f进程 {os.getpid()} 计算 {x} 的平方 {x*x}) return x*x if __name__ __main__: with multiprocessing.Pool(processes4) as pool: results pool.map(square, range(10)) print(所有结果, results)with语句会自动调用close()和join()非常方便。三、多进程编程的重要注意事项1. 全局变量不共享每个进程有独立的内存空间子进程会拷贝主进程的全局变量但修改子进程中的变量不会影响主进程反之亦然。如果需要进程间通信请使用Queue、Pipe或共享内存。2. 主进程与子进程的结束顺序默认情况下主进程会等待所有子进程结束后才退出。如果你希望主进程退出时立即终止所有子进程有两种方法守护进程设置p.daemon True主进程结束时会自动杀死守护子进程。p multiprocessing.Process(targetfunc) p.daemon True p.start()手动终止调用p.terminate()强制结束子进程。p.terminate() # 立即终止子进程四、总结什么时候该用进程CPU 密集型任务如图像处理、大量数学计算进程能利用多核 CPU效果显著。任务相互独立不需要频繁通信进程天然隔离安全可靠。大量短任务配合进程池避免频繁创建销毁的开销。如果任务主要是 I/O 密集型如网络请求、文件读写线程或协程可能更轻量。但无论如何掌握进程编程是 Python 多任务进阶的必经之路。下篇核心回顾进程锁Lock解决资源竞争。进程池Pool高效管理大量子进程。全局变量不共享主进程与子进程的结束方式需留意。

更多文章