代码示例
import multiprocessing
def calculate_square_sum(start, end):
return sum(i * i for i in range(start, end + 1))
if __name__ == '__main__':
num_processes = multiprocessing.cpu_count()
chunk_size = 1000000 // num_processes
processes = []
results = []
for i in range(num_processes):
start = i * chunk_size + 1
end = (i + 1) * chunk_size if i < num_processes - 1 else 1000000
p = multiprocessing.Process(target=calculate_square_sum, args=(start, end))
processes.append(p)
p.start()
for p in processes:
p.join()
result = calculate_square_sum(p.args[0], p.args[1])
results.append(result)
total_sum = sum(results)
print(f"1到1000000之间所有整数的平方和为: {total_sum}")
multiprocessing
模块与threading
模块在并行计算场景下的主要区别
- 资源占用:
multiprocessing
模块每个进程都有独立的内存空间,进程间数据不共享,资源消耗较大。
threading
模块的线程共享进程的内存空间,资源消耗相对较小。
- 全局解释器锁(GIL):
multiprocessing
模块不受GIL限制,每个进程能真正利用多核CPU并行计算,适合CPU密集型任务。
threading
模块受GIL限制,同一时刻只有一个线程能执行Python字节码,在CPU密集型任务中不能有效利用多核优势,但在I/O密集型任务中表现较好,因为线程切换开销小,能在I/O等待时释放GIL让其他线程执行。
- 编程复杂度:
multiprocessing
模块由于进程间数据不共享,进程间通信和同步机制相对复杂。
threading
模块由于共享内存,线程间通信相对简单,但容易出现数据竞争和死锁问题,需要小心处理同步。