如何通过starmap将子数组传递给多进程工作进程
问题诊断与解决方案
这是你对starmap_async的用法有误哦,不是它的特性问题~
核心问题分析
starmap_async的设计逻辑是:接收一个元组的可迭代序列,每个元组会被自动解包,作为一次函数调用的完整参数列表。你现在的代码是把(mats, 0.4, 0.9, shp, shp_o)作为单个元组传给它,所以进程池只会执行一次函数调用——把整个mats列表作为f的第一个参数,其余值依次作为后续参数,自然只激活一个工作进程。
而你期望的是:让mats里的每个(i, i+part)元组,分别和固定参数0.4, 0.9, shp, shp_o组合,形成独立的函数调用参数,分给多个进程处理。
修正后的代码示例
你需要重新生成参数列表,为每个子切片任务创建独立的参数元组:
# 先保留原有的mats生成逻辑 mats = [(i, i + part) for i in range(0, shp[1], part)] # 为每个切片任务拼接固定参数,生成独立的参数元组 task_params = [(start, end, 0.4, 0.9, shp, shp_o) for start, end in mats] # 传入starmap_async,此时每个元组对应一次f的调用 pool.starmap_async(f, task_params)
补充:map_async vs starmap_async的差异
map_async(func, iterable):把iterable中的每个元素,单独作为func的唯一参数执行调用starmap_async(func, iterable_of_tuples):把iterable_of_tuples中的每个元组解包,作为func的多个参数执行调用
调整参数结构后,就能实现你想要的:将每个子数组切片分配给不同工作进程并行处理的效果了。
内容的提问来源于stack exchange,提问作者marsmoon
相关产品推荐
相关产品推荐

