我們的實習生myc自從轉正了以後就開始消極怠工,也不發文章了。領導今天終於逮到機會和他促膝長談一番。
領導:myc啊,最近好像也沒見你發文章嗎?
myc:領導有所不知啊,最近事情太多,轉正後要培訓,培訓後公司要出去旅遊,旅遊後奧運又開始了。我們這些做MATLAB的程式設計師都是單執行緒的,一項任務完成了以後才能進行下一項啊。
領導知道myc說的有那麼一定道理,畢竟一個MATLAB語句在沒有結束前是不能簡單的呼叫另一個語句的。但作為多年的老領導,他知道可以用timer或者是Parallel Computing Toolbox來完成非同步或是並行的任務的。他剛想追問,myc就先發制人
myc: 我知道可以用timer object來達到非同步執行程式的效果,可是timer object管理起來麻煩啊。要說Parallel Computing,公司經費緊張,您看是不是也不太合適購買啊?
領導:……
然而領導豈是吃素的
領導:要說你啊,還是too young, too simple。 MATLAB可以呼叫Java, 你知道Java有個東西叫ProcessBuilder嗎?
myc: ……
廢話少說,show me the code:
假設我們有一個可執行程式,在他執行的時候會佔用當前的程序,一個最簡單的例子就是在MATLAB裡呼叫Linux的wget命令去下載一些東西:
>>
system
(
‘wget -O opencv-2。4。9。zip http://sourceforge。net/projects/opencvlibrary/files/opencv-unix/2。4。9/opencv-2。4。9。zip/download’
)
% 當前MATLAB會一直呈現Busy狀態
% 直到下載結束
>>
那麼如何讓MATLAB呼叫其它程序的時候不再佔用當前程序的資源呢?
% 呼叫ProcessBuilder
>>
pb
=
java
。
lang
。
ProcessBuilder
({
‘wget’
,
‘-O’
,
‘opencv-2。4。9。zip’
,
‘http://sourceforge。net/projects/opencvlibrary/files/opencv-unix/2。4。9/opencv-2。4。9。zip/download’
});
% 重新定向輸出和錯誤記錄
>>
pb
。
redirectOutput
(
java
。
io
。
File
(
‘log。txt’
))
>>
pb
。
redirectError
(
java
。
io
。
File
(
‘errorlog。txt’
))
% 啟動程序
>>
pb
。
start
()
% ProcessBuilder會fork出一個新的程序,當前MATLAB可以繼續使用
>>
領導:看到了?這就是如何在MATLAB中非同步呼叫程式
myc: fork my life。。