当前位置: 首页 > news >正文

LangGraph4j 学习系列(6)-并行工作流

接上节继续,本篇将学习如何实现并行工作流。

image

 上面这张图,用代码很容易绘制,参考以下代码。

核心代码

public static StateGraph<AgentState> getParallelGraph() throws GraphStateException {return new StateGraph<>(AgentState::new).addNode("node-1", node_async(new Node1Action())).addNode("node-2", node_async(new Node2Action())).addNode("node-3", node_async(new Node3Action())).addEdge(START, "node-1").addEdge("node-1", "node-2").addEdge("node-1", "node-3").addEdge("node-2", GraphDefinition.END).addEdge("node-3", GraphDefinition.END);
}

 

性能问题

虽然图上看着貌似node-2,node-3并行在跑,但真的如此吗?我们把node-2和node-3的apply()里加点sleep
public class Node2Action implements NodeAction<AgentState> {@Overridepublic Map<String, Object> apply(AgentState state) throws Exception {System.out.println("current Node: node-2");Thread.sleep(1000);return Map.of("myData", "node2-my-value","node2Key", "node2-value");}
}

  

public class Node3Action implements NodeAction<AgentState> {@Overridepublic Map<String, Object> apply(AgentState state) throws Exception {System.out.println("current Node: node-3");Thread.sleep(1000);return Map.of("myData", "node3-my-value","node3Key", "node3-value");}
}

然后在node-1里,记录下start时间戳

public class Node1Action implements NodeAction<AgentState> {@Overridepublic Map<String, Object> apply(AgentState state) throws Exception {System.out.println("current Node: node-1");Thread.sleep(1000);return Map.of("myData", "node1-my-value","node1Key", "node1-value",//记录开始时间"start", System.currentTimeMillis());}}

  

getParallelGraph().compile().invoke(Map.of("test", "test-init-value")).ifPresent(c -> {long start = (long) c.data().getOrDefault("start", 0L);System.out.println(c.data());long end = System.currentTimeMillis();System.out.println((end - start) + "ms");});

 

运行结果

current Node: node-1
current Node: node-2
current Node: node-3
{node1Key=node1-value, start=1770719927373, test=test-init-value, node2Key=node2-value, node3Key=node3-value, myData=node3-my-value}
2017ms

从第5行来看,耗时2秒+,显然是顺序执行的。
 

多线程提速

LangGraph4可以手动指定线程池实现真正的并发处理。
StateGraph<AgentState> graphNoThreadPool = getParallelGraph();ExecutorService executorService = Executors.newFixedThreadPool(2);
RunnableConfig rc = RunnableConfig.builder()//从node-1开始并行执行node-2和node-3(使用线程池).addParallelNodeExecutor("node-1", executorService).build();
graphNoThreadPool.compile().invoke(Map.of("test", "test-init-value"), rc) //调用时,使用特定的RunnableConfig.ifPresent(c -> {long start = (long) c.data().getOrDefault("start", 0L);System.out.println(c.data());long end = System.currentTimeMillis();System.out.println((end - start) + "ms");//记得关闭线程池executorService.shutdown();});

  

运行结果
current Node: node-1
current Node: node-2
current Node: node-3
{node1Key=node1-value, start=1770722528938, test=test-init-value, node2Key=node2-value, node3Key=node3-value, myData=node3-my-value}
1015ms


明显快多了。如果是jdk 25版本,也可以使用虚拟线程:

ExecutorService virtualThreadPerTaskExecutor = Executors.newVirtualThreadPerTaskExecutor();
RunnableConfig rc2 = RunnableConfig.builder()//从node-1开始并行执行node-2和node-3(使用线程池).addParallelNodeExecutor("node-1", virtualThreadPerTaskExecutor).build();
graphNoThreadPool2.compile().invoke(Map.of("test", "test-init-value"), rc2).ifPresent(c -> {long start = (long) c.data().getOrDefault("start", 0L);System.out.println(c.data());long end = System.currentTimeMillis();System.out.println((end - start) + "ms");});

  

文中源码:langgraph4j-study/src/main/java/org/bsc/langgraph4j/agent/_07_parallel at main · yjmyzz/langgraph4j-study · GitHub

http://www.jsqmd.com/news/425030/

相关文章:

  • 不踩坑!2026初中英语辅导机构实测推荐,家长闭眼抄作业 - 品牌测评鉴赏家
  • 2026小学英语辅导机构推荐|家长必看!避开坑,选对机构少走弯路 - 品牌测评鉴赏家
  • 盘点|2026十大高中语文教育机构!家长选课不踩坑,提分有方向 - 品牌测评鉴赏家
  • 高考阅读平均分58%?实测4家顶尖线上机构,避坑不踩雷 - 品牌测评鉴赏家
  • 高考文言文翻译难提分?这几家线上机构帮你逆袭 - 品牌测评鉴赏家
  • 高中文言文线上辅导哪家强?实测4家靠谱机构,避坑不花冤枉钱 - 品牌测评鉴赏家
  • 3 月做题记录
  • 新高考语文写作提分攻略:6家宝藏线上机构实测,精准击破4大写作痛点! - 品牌测评鉴赏家
  • 高中语文阅读提分难?实测五家热门线上机构,避坑指南+精准推荐 - 品牌测评鉴赏家
  • 高中语文阅读提分秘籍:线上辅导机构大揭秘 - 品牌测评鉴赏家
  • 救命!高中语文不用瞎刷题这5个神仙平台,从基础到拔高全搞定 - 品牌测评鉴赏家
  • 齿轮齿条转向器装配图(CAD)
  • 豆浆机Creo【结构详细,但装配图不可以编辑】
  • oeasy blender 016 晴天娃娃
  • LangGraph4j 学习系列(5)-Hook勾子
  • 三傻排序
  • AWR性能报告
  • Gemini 3.0 配合向量引擎,这才是 2026 年程序员的“降维打击”神器!
  • 强化学习TRPO(信任区域策略优化)
  • 5G物理层控制信令深度解析:从PDCCH到PUCCH的核心架构与设计
  • 未对文件 D:\node-v24.14.0-win-x64\node-v24.14.0-win-x64\npm.ps1 进行数字签名
  • 神经网络的基本原理
  • nodejs+php+vue 基于JAVA的动漫周边商城的设计与实现
  • 回归本质:第一性原理思维
  • 微信小程序 停车场预约管理系统
  • 微信小程序 家庭健康管理系统
  • 斯特林数{1,2}{列,行}
  • FPGA实现线性调频LFM,zynq实现线性调频lfmzynq pl ps端都可以实现线性调频
  • 寒假作业(2月23号)
  • 星际之门:宇宙 (Stargate Universe, SGU)