MATLAB Compiler SDK 单进程阻塞问题及解决

单个应用程序只能访问单个MCR计算引擎。这由进程范围的锁保护,因此多个组件无法同时访问计算引擎 (MATLAB运行时被设计为单线程执行,在任何给定时间,只有一个MATLAB函数可以有CPU时间)

也就是说 ,在java中通过多线程或者多个用户进行操作 来调用matlab jar的方法时,如果第一个请求正在执行matlab jar方法,其他的请求进行无法执行会被阻塞住 ,直到当前请求执行完,才会执行后续的matlab jar调用(这类似于在MATLAB的同一个打开会话中逐个调用所有MATLAB文件)。

解决单个计算引擎局限性的唯一方法是创建第二个进程(例如,通过运行可执行文件的第二个实例)。

解决无法并发执行的方法:

1.启动 Java 应用程序的多个进程来调用 Matlab。来自单个进程的调用使用相同的 MCR,该 MCR 具有进程范围的锁;但是来自不同进程的调用将在不同的 MCR 计算引擎上运行。

如果需要并发执行多个MATLAB函数调用,则需要使用"进程外 (out-of-process) "选项,通过该选项可以创建多个MATLAB运行时实例,每个实例都托管在自己的子进程中。

在这种情况下,建议不要频繁创建和销毁MATLAB运行时实例。相反,缓存多个与调用MATLAB函数的并行线程数量匹配的MATLAB运行时实例。这是因为创建和停止许多MATLAB运行时实例会产生性能成本,因为MATLAB运行时不是轻量级的,启动和停止需要时间。

Java开启进程外选项demo(多进程执行matlab 函数)案例:

首先在application.java启动类中设置为OUTPROC

if(!MWApplication.isMCRInitialized()) {//注意:如果./matlab启动着MATLAB完全版,则 isMCRInitialized 为true,导致不会执行if语句设置为不同进程故需关闭matlab完全版。

MWApplication.initialize(MWMCROption.OUTPROC );//这代表指示 MATLAB Runtime 在与 Java 应用程序不同的进程中运行 的选项。这样多进程就不会阻塞了,可以同时运行。

}

//这样new运行时,会在新子进程ctfserver中执行函数,从而避免阻塞

myclass cls = new myclass();

cls.hello();

finally{ if(cls!=null) cls.dispose() } //不要忘记dispose,否则ctfserver进程不会销毁。

注意:

MWApplication.initialize(MWMCROption.OUTPROC )此选项是全局的,设置之后对所有matlab任务都生效。在设置OUTPROC之前如果执行了matlab任务则使用默认选项initialize,全局生效, OUTPROC 就不会在设置了。

另外设置OUTPROC后,执行所有matlab任务都会开一个新进程执行(ctfserver进程)。执行完毕后, 需要dispose掉函数,此函数使用的ctfserver进程才会销毁 ,否则只有jvm销毁后才会销毁所有ctfserver进程,会导致占满内存。

****windows查看ctfserver

linux查看ctfserver: ps -aux|grep ctfserver

2.使用Matlab Production Server,它基本上可以方便地使用多个 MCR。这是一个需要单独许可证和安装的工具包。收费!没有尝试

3.除非您有非常具体的性能顾虑,否则不必局限于运行 MCR/编译代码。您实际上可以在服务器上安装 Matlab 本身,从同一个 Java 进程启动多个实例(例如无头实例),并通过MatlabControl或新的官方Java 版 MATLAB Engine API与它们进行通信。

相关推荐
吃好睡好便好9 小时前
查找函数的使用
学习·算法·matlab·生活·查找函数
chhttty14 小时前
Design Verifier检查:整型数溢出检查与修复
matlab·simulink
吃好睡好便好19 小时前
判断函数的使用
学习·算法·matlab·生活·判断函数
hu92451955920 小时前
Matlab保护源代码—P文件和exe文件详细解析
开发语言·matlab
史上最甜的躯20 小时前
控制系统——基础、导论;以直流电机控制系统为例详解微分方程模型、拉普拉斯变换、传递函数模型的理论、推导及仿真
matlab·simulink·传递函数·控制系统·拉普拉斯·电机模型
lingchen19062 天前
用MATLAB r2010b和r2016b求解微分方程组
开发语言·算法·matlab
可编程芯片开发2 天前
基于李雅普诺夫算法的四旋翼无人机姿态跟踪控制系统simulink建模与仿真
matlab·无人机·制造·四旋翼无人机·李雅普诺夫·姿态跟踪控制
matlab代码3 天前
基于matlab的玉米种子计数设计(GUI界面)【源码58期】
开发语言·matlab
吃好睡好便好4 天前
转换函数的使用
学习·matlab·生活·转换函数
吃好睡好便好5 天前
取整函数的使用
学习·matlab·生活·取整函数