无输入参数的函数可使用哪些方法实现并行?求对应代码示例
无参函数多进程并行实现方案
你当前的写法存在几个错误:
starmap方法要求传入第二个参数为参数元组的可迭代对象,直接只传函数名会触发参数缺失报错starmap是同步阻塞方法,调用后会直接等待所有进程执行完毕并返回结果列表,不需要也不能调用start()、join(),这两个API属于multiprocessing.Process实例,和进程池的map类方法无关
可使用的实现方法
方法1:用apply_async批量提交无参任务
适合不需要严格按提交顺序返回结果的场景,用法灵活:
import multiprocessing as mp def calculate(): # 你的业务逻辑 return 42 if __name__ == '__main__': # 定义要并行执行的calculate任务数量 task_count = 10 # 创建进程池,默认大小等于CPU核心数 pool = mp.Pool() # 批量提交无参任务 async_results = [pool.apply_async(calculate) for _ in range(task_count)] # 等待所有任务执行完成并获取结果 final_results = [res.get() for res in async_results] # 关闭进程池释放资源 pool.close() pool.join() print(final_results)
方法2:用starmap/map适配无参函数
适合需要按提交顺序返回结果的场景,只需要构造空参数的可迭代序列即可适配:
import multiprocessing as mp def calculate(): return 42 if __name__ == '__main__': task_count = 10 pool = mp.Pool() # 传入由空元组组成的可迭代对象,每个空元组对应一次无参调用 final_results = pool.starmap(calculate, [() for _ in range(task_count)]) pool.close() pool.join() print(final_results)
如果使用map方法,可以加一层占位参数的包装:
final_results = pool.map(lambda _: calculate(), range(task_count))
方法3:直接创建Process实例启动
适合任务数量少、不想使用进程池的场景:
import multiprocessing as mp def calculate(result_queue): res = 42 # 通过队列传递返回结果 result_queue.put(res) if __name__ == '__main__': task_count = 10 res_queue = mp.Queue() # 批量创建进程 processes = [mp.Process(target=calculate, args=(res_queue,)) for _ in range(task_count)] # 启动所有进程 for p in processes: p.start() # 等待所有进程执行完毕 for p in processes: p.join() # 读取所有返回结果 final_results = [res_queue.get() for _ in range(task_count)] print(final_results)
注意:Windows平台下必须添加if __name__ == '__main__'守卫,否则多进程启动会触发递归报错。
内容的提问来源于stack exchange,提问作者user16708120
相关产品推荐
相关产品推荐

