Self-restarting MathKernel - is it possible in Mathematica?

前端 未结 6 1297
慢半拍i
慢半拍i 2021-02-01 10:06

This question comes from the recent question \"Correct way to cap Mathematica memory use?\"

I wonder, is it possible to programmatically restart MathKernel keeping the c

6条回答
  •  滥情空心
    2021-02-01 10:57

    The following approach runs one kernel to open a front-end with its own kernel, which is then closed and reopened, renewing the second kernel.

    This file is the MathKernel input, C:\Temp\test4.m

    Needs["JLink`"];
    $FrontEndLaunchCommand="Mathematica.exe";
    UseFrontEnd[
    nb = NotebookOpen["C:\\Temp\\run.nb"];
    SelectionMove[nb, Next, Cell];
    SelectionEvaluate[nb];
    ];
    Pause[8];
    CloseFrontEnd[];
    Pause[1];
    UseFrontEnd[
    nb = NotebookOpen["C:\\Temp\\run.nb"];
    Do[SelectionMove[nb, Next, Cell],{12}];
    SelectionEvaluate[nb];
    ];
    Pause[8];
    CloseFrontEnd[];
    Print["Completed"]
    

    The demo notebook, C:\Temp\run.nb contains two cells:

    x1 = 0;
    Module[{}, 
     While[x1 < 1000000, 
      If[Mod[x1, 100000] == 0, Print["x1=" <> ToString[x1]]]; x1++];
     NotebookSave[EvaluationNotebook[]];
     NotebookClose[EvaluationNotebook[]]]
    
    Print[x1]
    x1 = 0;
    Module[{}, 
     While[x1 < 1000000, 
      If[Mod[x1, 100000] == 0, Print["x1=" <> ToString[x1]]]; x1++];
     NotebookSave[EvaluationNotebook[]];
     NotebookClose[EvaluationNotebook[]]]
    

    The initial kernel opens a front-end and runs the first cell, then it quits the front-end, reopens it and runs the second cell.

    The whole thing can be run either by pasting (in one go) the MathKernel input into a kernel session, or it can be run from a batch file, e.g. C:\Temp\RunTest2.bat

    @echo off
    setlocal
    PATH = C:\Program Files\Wolfram Research\Mathematica\8.0\;%PATH%
    echo Launching MathKernel %TIME%
    start MathKernel -noprompt -initfile "C:\Temp\test4.m"
    ping localhost -n 30 > nul
    echo Terminating MathKernel %TIME%
    taskkill /F /FI "IMAGENAME eq MathKernel.exe" > nul
    endlocal
    

    It's a little elaborate to set up, and in its current form it depends on knowing how long to wait before closing and restarting the second kernel.

提交回复
热议问题