多线程实现
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)
关键步骤解释
- 定义任务函数:
square_task
函数定义了具体的数值计算任务,这里是计算平方。
- 初始化任务列表和结果列表:
tasks
包含要执行任务的数值,results
用于存储任务执行结果。
- 创建并启动线程:通过
for
循环,为每个任务创建一个线程,将任务函数 square_task
及其参数传入线程,并启动线程。这里使用了 lambda
函数来包装任务函数以便将结果添加到 results
列表。
- 等待所有线程完成:通过
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)
关键步骤解释
- 定义任务函数:同样是
square_task
函数用于计算平方。
- 初始化任务列表:
tasks
存放要执行任务的数值。
- 使用进程池:
multiprocessing.Pool()
创建一个进程池,pool.map
方法会自动将任务分发给进程池中的进程并行执行,它接收任务函数 square_task
和任务列表 tasks
作为参数,并返回执行结果。这里使用 with
语句确保进程池在使用完毕后正确关闭和清理资源。
适用场景说明
- 多线程:适用于I/O密集型任务,由于Python的全局解释器锁(GIL),多线程在CPU密集型任务中无法利用多核优势,但在I/O操作时,线程可以在等待I/O完成时释放GIL,让其他线程有机会执行。
- 多进程:适用于CPU密集型任务,每个进程有独立的内存空间和Python解释器,不受GIL限制,可以充分利用多核CPU的优势进行并行计算。