MST

星途 面试题库

面试题:Python在for循环中如何实现并行操作

假设你有一个列表,里面包含一些数值计算任务,例如计算每个数的平方。在Python的for循环中,如何利用多线程或者多进程模块来并行执行这些任务,以提高效率?请写出具体的代码实现,并解释其中的关键步骤。
30.4万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

多线程实现

import threading


def square_task(num):
    return num * num


if __name__ == "__main__":
    tasks = [1, 2, 3, 4, 5]
    results = []
    threads = []
    for num in tasks:
        thread = threading.Thread(target=lambda n: results.append(square_task(n)), args=(num,))
        threads.append(thread)
        thread.start()
    for thread in threads:
        thread.join()
    print(results)

关键步骤解释

  1. 定义任务函数square_task 函数定义了具体的数值计算任务,这里是计算平方。
  2. 初始化任务列表和结果列表tasks 包含要执行任务的数值,results 用于存储任务执行结果。
  3. 创建并启动线程:通过 for 循环,为每个任务创建一个线程,将任务函数 square_task 及其参数传入线程,并启动线程。这里使用了 lambda 函数来包装任务函数以便将结果添加到 results 列表。
  4. 等待所有线程完成:通过 join 方法,主线程等待所有子线程完成任务,确保所有任务执行完毕后再输出结果。

多进程实现

import multiprocessing


def square_task(num):
    return num * num


if __name__ == "__main__":
    tasks = [1, 2, 3, 4, 5]
    with multiprocessing.Pool() as pool:
        results = pool.map(square_task, tasks)
    print(results)

关键步骤解释

  1. 定义任务函数:同样是 square_task 函数用于计算平方。
  2. 初始化任务列表tasks 存放要执行任务的数值。
  3. 使用进程池multiprocessing.Pool() 创建一个进程池,pool.map 方法会自动将任务分发给进程池中的进程并行执行,它接收任务函数 square_task 和任务列表 tasks 作为参数,并返回执行结果。这里使用 with 语句确保进程池在使用完毕后正确关闭和清理资源。

适用场景说明

  • 多线程:适用于I/O密集型任务,由于Python的全局解释器锁(GIL),多线程在CPU密集型任务中无法利用多核优势,但在I/O操作时,线程可以在等待I/O完成时释放GIL,让其他线程有机会执行。
  • 多进程:适用于CPU密集型任务,每个进程有独立的内存空间和Python解释器,不受GIL限制,可以充分利用多核CPU的优势进行并行计算。