构造映射函数:func,在func中显式提取参数,再调用multi_map方法
from multiprocessing.pool import Pool
import random
def split_jobs(jobs, num_works):
size = len(jobs) // num_works
jobs_list = [jobs[i * size:(i + 1) * size] for i in range(num_works)]
for i, e in enumerate(jobs[num_works * size:]):
jobs_list[i].append(e)
return jobs_list
def multi_map(func, jobs, num_works, **kwargs):
jobs = [(i, e) for i, e in enumerate(jobs)] # idx tag
random.shuffle(jobs) # work balance
jobs_list = split_jobs(jobs, num_works)
pool = Pool(num_works)
receive = []
for i, sub_jobs in enumerate(jobs_list):
receive.append(pool.apply_async(func=func, args=(sub_jobs, kwargs,)))
pool.close()
pool.join()
result = [(i, e) for sub_res in receive for i, e in sub_res.get()]
result = sorted(result, key=lambda x: x[0]) # sorted by idx
result = [e for i, e in result]
return result