一、多进程(Multiprocessing)
1、使用场景
适合CPU密集型任务,因为每个进程运行在独立的Python解释器中,不受全局解释器锁(GIL)的影响。
2、代码
from multiprocessing import Process import timedef task():print("Task is running")time.sleep(10)processes = [] for _ in range(50):p = Process(target=task)processes.append(p)p.start()for p in processes:p.join()
同时启动50个进程,50个进程执行同样的任务,他们没有GIL锁,时间几乎是并发的,执行结束10s左右
# time 统计的时间 real 0m10.135s user 0m0.094s sys 0m0.179s# 查看进程 ps -ef | grep -w 'process_example.py' | wc -l 52 root 3925498 3925455 0 15:52 pts/0 00:00:00 python3 process_example.py root 3925499 3925455 0 15:52 pts/0 00:00:00 python3 process_example.py root 3925500 3925455 0 15:52 pts/0 00:00:00 python3 process_example.py root 3925501 3925455 0 15:52 pts/0 00:00:00 python3 process_example.py root 3925502 3925455 0 15:52 pts/0 00:00:00 python3 process_example.py root 3925503 3925455 0 15:52 pts/0 00:00:00 python3 process_example.py root 3925504 3925455 0 15:52 pts/0 00:00:00 python3 process_example.py root 3925505 3925455 0 15:52 pts/0 00:00:00 python3 process_example.py root 3925565 3885440 0 15:52 pts/1 00:00:00 grep --color=auto process_example.py
二、多线程(Threading)
1、使用场景
适用于I/O密集型任务,如文件读取、网络请求等。线程共享内存,因此适合需要频繁数据交换的任务。
相比之下,对于CPU密集型任务,由于几乎所有的时间都用于执行Python代码,GIL几乎始终被一个线程所占用,导致其他线程无法并行执行。
然而,在I/O密集型任务中,频繁的I/O操作和GIL的适时释放使线程能够更好地并行工作,从而减轻GIL对性能的负面影响。
因此,在I/O密集型应用场景中,多线程的使用通常能够有效地提高性能,因为阻塞I/O操作的等待时间可以被用来执行其他进程或线程的工作。
2、案例
import threading import timedef cpu_intensive_task(n):print(f"CPU Thread {n} starting...")count = 0for _ in range(50): # 重复执行多次耗时任务# 一个更重的计算任务for i in range(10**7):count += itime.sleep(1) # 增加一些休眠时间print(f"CPU Thread {n} finished with count = {count}")def io_intensive_task(n):print(f"I/O Thread {n} starting...")for _ in range(50):# 模拟一个I/O耗时任务,例如文件读写time.sleep(2) # 模拟I/O等待时间print(f"I/O Thread {n} finished.")threads = [] num_cpu_threads = 4 num_io_threads = 4# 创建CPU密集型任务的线程 #for i in range(num_cpu_threads): # t = threading.Thread(target=cpu_intensive_task, args=(i,)) # threads.append(t) # t.start()# 创建I/O密集型任务的线程 for i in range(num_io_threads):t = threading.Thread(target=io_intensive_task, args=(i,))threads.append(t)t.start()for t in threads:t.join()print("All threads have completed.")
三、
四、
五、性能分析工具