You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:08:57