python并行_在Python中实现多个任务并行

本文介绍了如何在Python中使用multiprocessing模块实现多任务并行,通过Process类创建进程对象来实现并发执行。对比了Python中通过进程实现并行与Fortran的OpenMP通过线程实现并行的差异,并提供了代码示例,展示了并行和串行执行的时间差异,以及如何通过共享内存Value返回函数值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前在Fortran中有讲到OpenMP的并行:

这里讲如何在Python中如何实现多个任务的并行。在Python中,multiprocessing模块提供了一个Process类来代表一个进程对象。

Python中只有一个线程(是单线程的),所以是通过启动“进程”来实现并行;而在Fortran的OpenMP中是通过启动“线程”来实现并行。这是实现多任务并行常见的两种解决方案。

直观的理解就是打开电脑的任务管理器(底部栏右击),在应用程序旁边就是“进程”。运行本文的例子程序时,可以发现Python会产生多个“进程”,实现多个任务的并行,截图如下:

而在运行Fortran的OpenMP例子时,单个进程占了近100%CPU(四个核,一个核为25%),也就是OpenMP通过产生多个“线程”,分给指定CPU运行,实现多任务的并行,截图如下:

这边是自己整理的一个Python多任务并行(multiprocessing模块Process类)的例子:

from multiprocessing import Process

import os

import time

def run_proc(name): # 要执行的代码

start_time = time.perf_counter()

for i in range(300000000):

x = 100000^1000000000000

end_time = time.perf_counter()

print ('Process id running on %s = %s' % (name, os.getpid()), '; running time = %s' % (end_time-start_time))

if __name__ == '__main__':

# 串行

print('串行程序')

print('Process id = %s.' % os.getpid())

start_time = time.perf_counter()

run_proc('job1')

run_proc('job2')

run_proc('job3')

run_proc('job4')

end_time = time.perf_counter()

print('CPU执行时间(s)=', (end_time-start_time), '\n')

# 并行

print('并行程序')

print('Process id = %s.' % os.getpid())

start_time = time.perf_counter()

p = Process(target=run_proc, args=('job1',))

p.start()

p = Process(target=run_proc, args=('job2',))

p.start()

p = Process(target=run_proc, args=('job3',))

p.start()

p = Process(target=run_proc, args=('job4',))

p.start()

p.join() # join()方法可以等待子进程结束后再继续往下运行

end_time = time.perf_counter()

print('CPU执行时间(s)=', (end_time-start_time), '\n')

计算结果为:

Python运行速度会比Fortran慢,但熟悉后写起来挺方便的。在科学计算中,如果想用Python写代码,又想赶进度,除了手动操作并行外,还可以用上以上这种并行方法。尤其是当使用超算时,如果没有使用多任务并行,选择多个核的速度和选择一个核的运行的速度相差不多的,这时候如果仍然选择多个核(如12个核)进行运算,就很有可能会极大地浪费超算资源和科研经费。

如果是想返回函数值,可通过共享内存Value来实现,参考资料为[2]。这里写出一个代码例子,如下:

from multiprocessing import Process, Value

def run_proc(name, a, num): # 要执行的代码

num.value = a

if __name__ == '__main__':

num1 = Value('d', 0.0) # 共享内存

num2 = Value('d', 0.0) # 共享内存

p1 = Process(target=run_proc, args=('job1', 100, num1))

p1.start()

p2 = Process(target=run_proc, args=('job2', 200, num2))

p2.start()

p2.join()

print(num1.value)

print(num2.value)

计算结果为:

参考资料:

+1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值