我正在寻找一种方法来并行启动两个函数,每个函数都在一组给定的不同参数上执行。我用它pool.map
来实现这一点。我创建了两个不同的进程,每个进程启动一个执行map
. 这行得通 - 执行顺序有点狂野,但我会把它留到另一个问题上。
现在我在这里也找到了另一种方法(见第一个答案)。他们只使用一个池并map_async
连续调用两次。所以我想知道,是否有这样做的首选方法?因为我读过(遗憾的是我不记得在哪里)最好只使用一个池,这意味着第二种方法(只使用一个池)更好。但是当我测量时间时,第一种方法(在不同的进程中使用两个池)实际上要快一点。此外,在第一种方法中,函数实际上是并行运行的,而在第二种方法中,首先执行第一次调用map_async
,然后执行第二次调用。
这是我的测试代码:
from multiprocessing import Process, Pool
import time
import os
multiple_pools = True
data = list(range(1, 11))
def func_a(param):
print(f'running func_a in process {os.getpid()}')
print(f'passed argument: {param}')
print('calculating...\n')
time.sleep(1.5)
print('done\n')
def func_b(param):
print(f'running func_b in process {os.getpid()}')
print(f'passed argument: {param}')
print('calculating...\n')
time.sleep(2.5)
print('done\n')
def execute_func(func, param):
p = Pool(processes=8)
with p:
p.map(func, param)
if __name__ == '__main__':
if not multiple_pools:
t0 = time.time()
p = Pool(processes=8)
res = p.map_async(func_a, data)
res = p.map_async(func_b, data)
p.close()
p.join()
t1 = time.time()
dt = t1 -t0
print(f'time spent with one pool: {dt} s')
else:
t0 = time.time()
p1 = Process(target=execute_func, args=(func_a, data))
p2 = Process(target=execute_func, args=(func_b, data))
p1.start()
p2.start()
p1.join()
p2.join()
p1.close()
p2.close()
t1=time.time()
dt = t1 -t0
print(f'time spent with two pools, each inside an own process: {dt} s')
再说一次,我的问题是:有没有一种方法比另一种更受欢迎?或者甚至可能有其他/更好的方法来做到这一点?