MST

星途 面试题库

面试题:Python并行计算之多进程基础

在Python中,使用`multiprocessing`模块实现一个简单的并行计算示例,计算1到1000000之间所有整数的平方和。请写出代码,并解释`multiprocessing`模块与`threading`模块在并行计算场景下的主要区别。
10.4万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

代码示例

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模块在并行计算场景下的主要区别

  1. 资源占用
    • multiprocessing模块每个进程都有独立的内存空间,进程间数据不共享,资源消耗较大。
    • threading模块的线程共享进程的内存空间,资源消耗相对较小。
  2. 全局解释器锁(GIL)
    • multiprocessing模块不受GIL限制,每个进程能真正利用多核CPU并行计算,适合CPU密集型任务。
    • threading模块受GIL限制,同一时刻只有一个线程能执行Python字节码,在CPU密集型任务中不能有效利用多核优势,但在I/O密集型任务中表现较好,因为线程切换开销小,能在I/O等待时释放GIL让其他线程执行。
  3. 编程复杂度
    • multiprocessing模块由于进程间数据不共享,进程间通信和同步机制相对复杂。
    • threading模块由于共享内存,线程间通信相对简单,但容易出现数据竞争和死锁问题,需要小心处理同步。