【问题标题】:Asynchronous execution with MatlabMatlab 异步执行
【发布时间】:2017-05-05 12:30:58
【问题描述】:

我目前有一个 Matlab 应用程序,它接收来自另一个外部应用程序(用 JAVA 编码)的请求。

Java 应用程序使用 Yair Atlman 的“未记录的 Matlab”中描述的系统通知 matlab。我们可以通知 Matlab 各种动作,命名为 A 和 B,触发不同的回调。

问题如下:在某些情况下,Java 应用程序可能会在处理第一个通知之前发送一个新通知。在一个理想的世界里,这是我希望发生的事情:

  • Matlab 接收A
  • Matlab 开始执行回调 A
  • Matlab 接收 B
  • Matlab 持有回调 B 并继续执行回调 A
  • Matlab 执行回调 B

这是发生了什么:

  • Matlab 接收A
  • Matlab 开始执行回调 A
  • Matlab 接收 B
  • Matlab 暂停回调 A
  • Matlab 执行回调 B
  • Matlab 完成回调 A

我尝试了几种可能的解决方案,但都失败了,最后我设法找到了一个奇怪的解决方法,但是这个解决方法有问题,我必须摆脱它。我无法访问并行计算。 我的尝试涉及将接收到的操作存储在静态队列中并锁定回调执行,但由于 A 永远不会被清除,它最终会进入无限循环。

由于 B 实际上可能需要 A 生成的数据,因此完美的解决方案实际上是 Java 保留 B 通知,直到它收到来自 Matlab 的“完整”通知。我也尝试在这里使用并行性,但 Matlab 暂停了它的执行,java 从未收到通知并永远休眠......

在这一点上,我愿意采取任何解决方法,因为我完全不知道一个强大的解决方案。

谢谢

PS:必须同时在 matlab 2011b 和 2014b 上工作

【问题讨论】:

    标签: java matlab asynchronous parallel-processing


    【解决方案1】:

    使用 Matlab Control 找到了解决方案,该框架允许您直接与 Matlab 通信,同时避免大多数潜在的死锁问题:

    https://code.google.com/archive/p/matlabcontrol/

    这是我使用该框架来满足我的需求的类实现(许多其他用法也是可能的):

    package framework.matlab.events;
    
    import matlabcontrol.MatlabConnectionException;
    import matlabcontrol.MatlabInvocationException;
    import matlabcontrol.MatlabProxy;
    import matlabcontrol.MatlabProxyFactory;
    import matlabcontrol.MatlabProxyFactoryOptions;
    
    public class MatlabEvent {  
    
        private String      mMethodName;
        private int         mMethodOutputs;
        private MatlabProxy mProxy;
    
        public void setMethodParameters(String iMethodName, int iMethodOuputs) {
            mMethodName     = iMethodName;
            mMethodOutputs  = iMethodOuputs;        
        }
    
        public void callMatlabMethod(Object ... obj) {
    
            connect();
    
            try {
                mProxy.returningFeval(mMethodName, mMethodOutputs, obj);    
            } catch (MatlabInvocationException e) {
                e.printStackTrace();
            }
            finally   {
                disconnect();
            }   
        }
    
        private void connect() {
    
            MatlabProxyFactoryOptions options = new MatlabProxyFactoryOptions.Builder()
                    .setUsePreviouslyControlledSession(true)
                    .build();
    
            MatlabProxyFactory factory  = new MatlabProxyFactory(options);      
    
            try {
                mProxy = factory.getProxy();
            } catch (MatlabConnectionException e) {
                e.printStackTrace();
            }
    
        }
    
        private void disconnect() {
            if (null != mProxy) {
                mProxy.disconnect();
            }
        }
    }
    

    因此,我不再使用 Yair Altman 创建的 Matlab 通知系统。

    【讨论】:

      猜你喜欢
      • 2012-02-05
      • 2017-11-14
      • 2013-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-25
      • 2011-03-20
      相关资源
      最近更新 更多