mcpField
P
parallelmap

parallelmap

本地服务
github.com/CloudCorpRecords开发工具01 周前更新

关于 parallelmap

parallelmap 是用于分析任务或测试依赖图的本地 MCP 服务和命令行工具。它可报告可并行执行的层级、耗时、关键路径、可选工作线程调度以及循环依赖。

主要功能

  1. 01按依赖关系划分任务层级
  2. 02比较串行与并行耗时
  3. 03确定性地识别关键路径
  4. 04按工作线程数安排任务
  5. 05报告依赖循环
  6. 06验证图输入

适用场景

  1. 01估算测试套件的并行运行时间
  2. 02为固定工作线程池规划任务流水线
  3. 03查找阻止调度的依赖循环

MCP 相关

它向 MCP 客户端提供 `map_parallelization` 工具。该工具接收任务耗时和依赖关系,并可选地根据工作线程数生成调度方案。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"cloudcorprecords-parallelmap": {
"command": "npx",
"args": [
"-y",
"@reneturcios/parallelmap"
]
}
}
}
启动命令npx -y @reneturcios/parallelmap

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npm@reneturcios/parallelmap0.1.0
ocighcr.io/cloudcorprecords/parallelmap:0.1.0

工具

1

收录的工具列表 · 更新于 1 周前

参数类型必填说明
jobsarray是工作负载中的作业或测试(至少一个)
workersinteger否用于贪心调度的并行工作线程数(可选;省略时调度为空,且总耗时为无界并行时间)

详细介绍

parallelmap

测试套件或作业流水线需要多长时间,就会运行多长时间——除非其中某些工作可以并行执行。parallelmap 接收工作负载图——每个作业的名称、持续时间,以及必须先于它完成的作业名称——并梳理出哪些工作可以安全地并行执行:

  • 层级 — 按深度分组的作业。第 0 层包含没有依赖项的作业;其他每个作业都位于其最深依赖项上一层。同一层的所有作业都可以同时运行,但须等其下方的层级完成。
  • 顺序执行时间与并行执行时间 — 所有持续时间的总和与无限工作线程下的总耗时(最晚的最早完成时间),以及两者之间的加速比。所有报告的秒数均四舍五入到 3 位小数,加速比根据这些舍入后的数值计算。
  • 关键路径 — 决定并行执行时间的作业链,按执行顺序排列。若最晚完成的作业有多个,或沿链回溯的任一步有并列项,则选择作业名称最小的项,因此路径完全确定。
  • 工作线程调度 — 传入工作线程数量后,贪心列表调度会按(层级,名称)的优先顺序排列作业,并将每个作业分配给最先空闲的工作线程(并列时选择索引最小的工作线程);作业开始时间不会早于其依赖项在该调度下的完成时间。调度结果会报告每个作业的工作线程、开始时间和完成时间,并按(开始时间,工作线程,作业)排序,同时报告最终总耗时。未指定工作线程数量时,不会生成调度结果,总耗时为无限工作线程下的并行执行时间。
  • 环路检测 — 当作业无法调度时,parallelmap 不会报错或猜测,而是返回 ok: false 和确切的环路:按名称及依赖项升序执行的深度优先搜索会将找到的第一个环路作为构成该环路的作业列表返回(若作业依赖自身,则返回仅含该作业名称的环路),时间字段为 null。

图必须是闭合的:depends_on 条目中引用了未提供的作业会导致验证错误;作业名称缺失或重复、持续时间缺失、为负数或非有限值,以及工作线程数量不是至少为 1 的整数,也都会导致验证错误。错误会指出出错路径(例如 jobs[1].depends_on[0] references unknown job "build"),且不会生成部分映射。计算是纯本地的:不使用网络、不需要配置,也不会读取你传入的输入以外的文件。

CLI

npx @reneturcios/parallelmap map --input args.json
npx @reneturcios/parallelmap --version

args.json 包含完整的参数对象:

{
  "jobs": [
    { "name": "compile", "duration_seconds": 30 },
    { "name": "unit", "duration_seconds": 45, "depends_on": ["compile"] },
    { "name": "lint", "duration_seconds": 10, "depends_on": ["compile"] },
    { "name": "package", "duration_seconds": 5, "depends_on": ["unit", "lint"] }
  ],
  "workers": 2
}

每个作业的 depends_on 默认为 [],workers 为可选的全局参数。映射以 JSON 格式输出:

{
  "ok": true,
  "levels": [["compile"], ["lint", "unit"], ["package"]],
  "sequential_seconds": 90,
  "parallel_seconds": 80,
  "speedup": 1.125,
  "critical_path": ["compile", "unit", "package"],
  "cycle": [],
  "schedule": [
    { "job": "compile", "worker": 0, "start": 0, "finish": 30 },
    { "job": "unit", "worker": 0, "start": 30, "finish": 75 },
    { "job": "lint", "worker": 1, "start": 30, "finish": 40 },
    { "job": "package", "worker": 1, "start": 75, "finish": 80 }
  ],
  "makespan_seconds": 80
}

退出代码:成功时为 0;运行时错误(包括输入文件无法读取或无效,以及输入无效)时为 1;用法错误时为 2。

MCP 服务

npx -y @reneturcios/parallelmap mcp

MCP 客户端配置:

{
  "mcpServers": {
    "parallelmap": {
      "command": "npx",
      "args": ["-y", "@reneturcios/parallelmap", "mcp"]
    }
  }
}
工具
  • map_parallelization — 映射哪些作业或测试可以安全地并行执行。
    • jobs(数组,必填,至少一个元素)— 作业对象 {name, duration_seconds, depends_on?};name 在集合中必须唯一,每个 depends_on 条目必须引用另一个已提供的作业
    • workers(整数,可选,至少为 1)— 若提供,则会包含分配到相应数量工作线程的贪心调度结果

返回 {ok, levels, sequential_seconds, parallel_seconds, speedup, critical_path, cycle, schedule, makespan_seconds};若存在环路,则返回 {ok: false, cycle, levels: [], sequential_seconds, parallel_seconds: null, speedup: null, critical_path: [], schedule: [], makespan_seconds: null}。

Docker

docker run -i ghcr.io/cloudcorprecords/parallelmap
docker run --rm -v "$PWD:/w" ghcr.io/cloudcorprecords/parallelmap map --input /w/args.json

开发

npm install
npm run build   # tsc -> dist/
npm test        # tsx --test test/*.test.ts (pure local, no network)
npm run dev     # run the CLI from source

许可证

MIT — 版权所有 (c) 2026 Rene Turcios

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。