在this answer我詳細使用task
和job
功能異步執行的方法,但我認爲一個簡單的load
是parfeval
可能是最容易的。例如,
f = parfeval(@load,1,'myfile.dat'); % asynchronous, move on to intensiveCompute
results = intensiveCompute(data);
data = fetchOutputs(f); % Blocks until complete
注:一定要允許在Windows防火牆MATLAB.exe,smpd.exe和mpiexec.exe傳入連接。您應該被提示第一次啓動游泳池(由parfeval
自動執行)。
這裏有一個簡單的例子來說明它是如何工作的:
>> x = magic(5);
>> save x.mat x
>> f = parfeval(@load,1,'x.mat');
Starting parallel pool (parpool) using the 'local' profile ... connected ...
>> f
f =
FevalFuture with properties:
ID: 1
Function: @load
State: running
ErrorIdentifier:
ErrorMessage:
在這一點上,我們看到,該命令仍然在工人運行。顯然,我們可以做的事情不是工作?只需勾選更有用......但這裏有一個短暫的等待之後會發生什麼:
>> f
f =
FevalFuture with properties:
ID: 1
Function: @load
State: finished (unread)
ErrorIdentifier:
ErrorMessage:
>> % all done, load the data
>> data = fetchOutputs(f) % Blocks until complete
data =
x: [5x5 double]
不會'parfor'給你這種行爲? – Shai
也許我錯過了一些東西,但是如何使用parfor來並行執行2個不同的任務?我已經將chappjc的解決方案標記爲答案,但如果使用parfor有一些聰明的方法,那麼知道它會很棒。 – user1715925