【问题标题】:Detect if MATLAB startup.m is running on a worker检测 MATLAB startup.m 是否在 worker 上运行
【发布时间】:2013-05-20 14:58:36
【问题描述】:

一位同事有一个包含交互式代码的 MATLAB startup.m 文件(它调用命令 questdlg 询问他希望在哪个项目目录中工作)。

直接运行 MATLAB 时,这对他来说效果很好。但是,他还需要并行运行 MATLAB 代码,并启动了 matlabpool

启动时,matlabpool 中的工作人员正在运行他的startup.m 文件,到达questdlg 然后挂起(无限期,或直到 Ctrl C)。

一个简单的解决方案是从他的startup.m 中删除交互式代码,因为这并不是必需的。

但是有没有办法检测这个startup.m 是否由正在启动的工作人员运行——类似于isdeployedismcc?然后,他可以保留他认为有用的交互式代码,但仅在不启动 worker 时执行。

getCurrentWorker 命令似乎是需要的,但我相信它只在任务执行期间有效,而不是在启动时有效。

【问题讨论】:

    标签: parallel-processing matlab


    【解决方案1】:

    您可以使用usejava 函数来查看交互式桌面是否正在运行,这可能是一个足够好的近似值,除非您经常使用-nodesktop 模式。

    if usejava('desktop')
        questdlg(...);
    end
    

    【讨论】:

    • 谢谢@Edric。就个人而言,如果它是“正确”的做法,我会接受无证的东西 - 但基本上有效的有文件的东西在这里也很好。听起来usejava 会起作用 - 谢谢!
    【解决方案2】:

    看看labindex,如果失败了,看看labSendlabReceive

    【讨论】:

    • 不幸的是,这不会告诉您任何信息,因为它们的设置(或未设置)比startup.m
    • @JoshuaBarr 抱歉,我应该提到我也尝试过labindex,但由于@Edric 提到的原因,它不起作用。 @Edric,你有什么建议吗?
    • @SamRoberts - 是的,我相信你意识到有一些方法和手段 - 这是你希望去无证的问题。我会发布一个应该有帮助的答案。
    【解决方案3】:

    至少对于我的 R2014b,

       isempty(getCurrentWorker)
    

    似乎完成了这项工作:

    >> getCurrentWorker
    ans =
         []
    >> parfor i=1:2;disp(getCurrentWorker);end
     Worker
                     Host: IMP.OIMRDS
             ComputerType: WIN64
    
                ProcessId: 15784
     Worker
                     Host: IMP.OIMRDS
             ComputerType: WIN64
    
                ProcessId: 17220
    

    【讨论】:

      猜你喜欢
      • 2017-01-08
      • 2016-12-24
      • 1970-01-01
      • 2019-04-09
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多