在这个答案中,我详细介绍了一种使用task
andjob
函数进行异步执行的方法,但我认为可能是最简单的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:
此时,我们看到命令仍在worker上运行。显然,我们可以做一些比简单地检查工作更有用的事情……但这是短暂等待后会发生的事情:
>> 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]