写一个简单的工作流(三)
2023-03-14 10:24:41 时间
上午测试了下并发情况下的表现,测试场景:一个有20个节点,包括选择、顺序、并行路由的流程,所有节点都设置为自动执行,1000个线程并发启动案例,也就是这个流程同时有1000个案例在跑,全部跑完结果差强人意,比单线程慢了接近30倍。仔细调整了算法和加锁粒度,尽管整体性能有所提高,但是多线程和单线程间执行的差距仍然没有多大变化,性能瓶颈还是在核心的调度算法上,还需要分析下。测试程序如下:
package net.rubyeye.insect.workflow.test;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CyclicBarrier;
import net.rubyeye.insect.workflow.Place;
import net.rubyeye.insect.workflow.Token;
import net.rubyeye.insect.workflow.Transition;
import net.rubyeye.insect.workflow.WorkFlow;
import net.rubyeye.insect.workflow.WorkFlowManager;
import net.rubyeye.insect.workflow.basic.BasicWorkflowManager;
import net.rubyeye.insect.workflow.comm.TransitionType;
import net.rubyeye.insect.workflow.config.DefaultConfiguration;
import junit.framework.TestCase;
public class CompositeProcessTest extends TestCase {
private WorkFlowManager wm;
WorkFlow composite;
private CyclicBarrier barrier;
private static final int total = 1000;
@Override
protected void setUp() throws Exception {
this.barrier = new CyclicBarrier(total + 1);
wm = new BasicWorkflowManager();
wm.setConfiguration(new DefaultConfiguration());
WorkFlow sequence = wm.getWorkFlow("sequence");
WorkFlow concurrency = wm.getWorkFlow("concurrency");
WorkFlow choose = wm.getWorkFlow("choose");
// 组合流程
composite = new WorkFlow();
composite.setName("composite");
composite.setId(100);
wm.saveWorkFlow(composite);
// 修改开始结束节点的输入输出库所
sequence.getEnd().setType(TransitionType.NORMAL);
sequence.getEnd().setOutputs(concurrency.getStart().getInputs());
concurrency.getEnd().setType(TransitionType.NORMAL);
concurrency.getEnd().setOutputs(choose.getStart().getInputs());
composite.setStart(sequence.getStart());
composite.setEnd(choose.getEnd());
List<Transition> transitions = new ArrayList<Transition>();
transitions.addAll(sequence.getTransitions());
transitions.addAll(concurrency.getTransitions());
transitions.addAll(choose.getTransitions());
composite.setTransitions(transitions);
}
public void testConcurrencyCompositeProcesss() throws Exception {
for (int i = 0; i < total; i++) {
new FlowThread().start();
}
barrier.await();
long start = System.currentTimeMillis();
barrier.await();
long end = System.currentTimeMillis();
System.out.println("创建" + total + "个流程并发运行完毕\n花费时间:" + (end - start)
/ 1000.0 + "秒");
for (Transition transition : composite.getTransitions()) {
System.out.println(transition.getName() + " "
+ transition.isEnable());
for (Place place : transition.getOutputs()) {
System.out.println("place " + place.getId() + " "
+ place.getTokens().size());
}
}
}
public void testCompositeProcesss() throws Exception {
long start = System.currentTimeMillis();
for (int i = 0; i < total; i++) {
Token token1 = wm.startWorkFlow("composite");
token1.setAttribute("name", "dennis");
token1.setAttribute("num", 21);
wm.doAction(token1.getId());
assertTrue(token1.isFinished());
}
long end = System.currentTimeMillis();
System.out.println("创建" + total + "个流程运行完毕\n花费时间:" + (end - start)
/ 1000.0 + "秒");
}
class FlowThread extends Thread {
@Override
public void run() {
try {
barrier.await();
// wm = new BasicWorkflowManager();
Token token1 = wm.startWorkFlow("composite");
token1.setAttribute("name", "dennis");
token1.setAttribute("num", 21);
wm.doAction(token1.getId());
assertTrue(token1.isFinished());
barrier.await();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CyclicBarrier;
import net.rubyeye.insect.workflow.Place;
import net.rubyeye.insect.workflow.Token;
import net.rubyeye.insect.workflow.Transition;
import net.rubyeye.insect.workflow.WorkFlow;
import net.rubyeye.insect.workflow.WorkFlowManager;
import net.rubyeye.insect.workflow.basic.BasicWorkflowManager;
import net.rubyeye.insect.workflow.comm.TransitionType;
import net.rubyeye.insect.workflow.config.DefaultConfiguration;
import junit.framework.TestCase;
public class CompositeProcessTest extends TestCase {
private WorkFlowManager wm;
WorkFlow composite;
private CyclicBarrier barrier;
private static final int total = 1000;
@Override
protected void setUp() throws Exception {
this.barrier = new CyclicBarrier(total + 1);
wm = new BasicWorkflowManager();
wm.setConfiguration(new DefaultConfiguration());
WorkFlow sequence = wm.getWorkFlow("sequence");
WorkFlow concurrency = wm.getWorkFlow("concurrency");
WorkFlow choose = wm.getWorkFlow("choose");
// 组合流程
composite = new WorkFlow();
composite.setName("composite");
composite.setId(100);
wm.saveWorkFlow(composite);
// 修改开始结束节点的输入输出库所
sequence.getEnd().setType(TransitionType.NORMAL);
sequence.getEnd().setOutputs(concurrency.getStart().getInputs());
concurrency.getEnd().setType(TransitionType.NORMAL);
concurrency.getEnd().setOutputs(choose.getStart().getInputs());
composite.setStart(sequence.getStart());
composite.setEnd(choose.getEnd());
List<Transition> transitions = new ArrayList<Transition>();
transitions.addAll(sequence.getTransitions());
transitions.addAll(concurrency.getTransitions());
transitions.addAll(choose.getTransitions());
composite.setTransitions(transitions);
}
public void testConcurrencyCompositeProcesss() throws Exception {
for (int i = 0; i < total; i++) {
new FlowThread().start();
}
barrier.await();
long start = System.currentTimeMillis();
barrier.await();
long end = System.currentTimeMillis();
System.out.println("创建" + total + "个流程并发运行完毕\n花费时间:" + (end - start)
/ 1000.0 + "秒");
for (Transition transition : composite.getTransitions()) {
System.out.println(transition.getName() + " "
+ transition.isEnable());
for (Place place : transition.getOutputs()) {
System.out.println("place " + place.getId() + " "
+ place.getTokens().size());
}
}
}
public void testCompositeProcesss() throws Exception {
long start = System.currentTimeMillis();
for (int i = 0; i < total; i++) {
Token token1 = wm.startWorkFlow("composite");
token1.setAttribute("name", "dennis");
token1.setAttribute("num", 21);
wm.doAction(token1.getId());
assertTrue(token1.isFinished());
}
long end = System.currentTimeMillis();
System.out.println("创建" + total + "个流程运行完毕\n花费时间:" + (end - start)
/ 1000.0 + "秒");
}
class FlowThread extends Thread {
@Override
public void run() {
try {
barrier.await();
// wm = new BasicWorkflowManager();
Token token1 = wm.startWorkFlow("composite");
token1.setAttribute("name", "dennis");
token1.setAttribute("num", 21);
wm.doAction(token1.getId());
assertTrue(token1.isFinished());
barrier.await();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}
文章转自庄周梦蝶 ,原文发布时间2007-10-12
相关文章
- 在 Go 里用 CGO?这 7 个问题你要关注!
- 9款优秀的去中心化通讯软件 Matrix 的客户端
- 求职数据分析,项目经验该怎么写
- 在OKR中,我看到了数据驱动业务的未来
- 火山引擎云原生大数据在金融行业的实践
- OpenHarmony富设备移植指南(二)—从postmarketOS获取移植资源
- 《数据成熟度指数》报告:64%的企业领袖认为大多数员工“不懂数据”
- OpenHarmony 小型系统兼容性测试指南
- 肯睿中国(Cloudera):2023年企业数字战略三大趋势预测
- 适用于 Linux 的十大命令行游戏
- GNOME 截图工具的新旧截图方式
- System76 即将推出的 COSMIC 桌面正在酝酿大变化
- 2GB 内存 8GB 存储即可流畅运行,Windows 11 极致精简版系统 Tiny11 发布
- 迎接 ecode:一个即将推出的具有全新图形用户界面框架的现代、轻量级代码编辑器
- loongarch架构介绍(三)—地址翻译
- Go 语言怎么解决编译器错误“err is shadowed during return”?
- 敏捷:可能被开发人员遗忘的部分
- Denodo预测2023年数据管理和分析的未来
- 利用数据推动可持续发展
- 在 Vue3 中实现 React 原生 Hooks(useState、useEffect),深入理解 React Hooks 的