查询和取消parfeval
期货
当你使用parfeval
或parfevalOnAll
要在后台运行计算,需要创建名为期货的对象。您可以使用状态
属性,以查明它是正在运行、排队还是已完成。你也可以使用FevalQueue
属性,以访问正在运行和排队的期货。要取消期货,您可以使用取消
函数。在这个例子中,你:
使用
取消
直接取消期货。检查已完成期货的完成错误。
使用
FevalQueue
物业进入期货。
向队列添加工作
创建一个并行池p
有两个工人。
P = parpool(2);
使用'Processes'配置文件启动并行池(parpool)…连接到并行池(工人数:2)。
当你使用parfeval
为了在后台运行计算,该函数为每个计算创建一个future,并将其添加到池队列中。任务一直在队列中,直到一个worker空闲。当一个worker空闲时,如果队列不为空,它就开始计算一个任务。当一个worker完成一个任务时,该任务将从队列中移除,该worker变为空闲。
使用parfeval
创建一个期货数组f
通过指示工作人员执行函数暂停
.使用的论证1
对于第三个未来,和一个争论正
所有其他的未来。
为N = 1:5如果N == 3 f(N) = parfeval(@pause,0,1);其他的f(n) = parfeval(@pause,0,Inf);结束结束
每次使用parfeval
返回一个表示函数在worker上执行的future对象。除了第三个未来,每一个未来都需要无限多的时间来计算。未来是由parfeval (@pause 0正)
是未来的一个极端情况,它会降低队列的速度。
直接取消期货
您可以使用状态
财产获得期货地位。构造一个单元数组的每个未来的状态f
.
{f。州}
ans =1×5单元{“奔跑”}{“奔跑”}{“排队”}{“排队”}{“排队”}
除了第三个任务,其他任务都永远暂停。
取消第二个将来直接用取消
.
取消(f (2));{f。州}
ans =1×5单元{“奔跑”}{'完成'}{“奔跑”}{“排队”}{“排队”}
在你取消第二个将来时后,第三个将来时运行。等待第三个未来完成,然后再次检查状态。
等待(f (3));{f。州}
ans =1×5单元{“奔跑”}{'完成'}{'完成'}{“奔跑”}{“排队”}
第三个未来现在有了国家“完成”
.
检查完成错误
当一个未来完成时,它就完了状态
房地产成为“完成”
.要区分被取消的期货和正常完成的期货,请使用错误
财产。
流(“f (2): % s \ n”f (2) .Error.message)
f(2):期货被取消执行。
流(“f (3): % s \ n”f (3) .Error.message)
f (3):
如message属性所示,代码取消了第二个未来。第二个将来时被取消了,正如在消息
财产。第三个future完成时没有出现错误,因此没有错误消息。
取消池队列中的期货
您可以使用FevalQueue
属性访问池队列中的期货。
p.FevalQueue
ans = FevalQueue with properties: Number Queued: 1 Number Running: 2
队列有两个属性:RunningFutures
而且QueuedFutures
.的RunningFutures
属性是与当前正在运行的任务相对应的期货数组。
disp (p.FevalQueue.RunningFutures)
1 x2 FevalFuture数组:ID状态FinishDateTime功能错误 -------------------------------------------------------- 1 3运行@pause 2 6 @pause运行
的QueuedFutures
属性是与当前排队且未运行的任务对应的期货数组。
disp (p.FevalQueue.QueuedFutures)
FevalFuture属性:ID: 7函数:@pause CreateDateTime: 08-Mar-2021 10:03:13 StartDateTime: RunningDuration: 0 days 0h 0m 0s状态:排队错误:无
您可以取消单个期货或一组期货。取消所有的期货QueuedFutures
.
取消(p.FevalQueue.QueuedFutures);{f。州}
ans =1×5单元{“奔跑”}{'完成'}{'完成'}{“奔跑”}{'完成'}
RunningFutures
而且QueuedFutures
从最新到最旧,不管是否f
是按从最新到最老的顺序排列的。每个未来都是独一无二的ID
属性。检查ID
每个期货的属性f
.
disp (f)
1x5 FevalFuture array: ID State FinishDateTime Function Error -------------------------------------------------------------- 1 3 running @pause 2 4 finished (unread) 08-Mar-2021 10:03:20 @pause Error 3 5 finished (unread) 08-Mar-2021 10:03:21 @pause 4 6 running @pause 5 7 finished (unread) 08-Mar-2021 10:03:22 @pause Error
将结果与ID
的属性RunningFutures
.
为j = 1:length(p.FevalQueue.RunningFutures) rf = p.FevalQueue.RunningFutures(j);流("p.FevalQueue.RunningFutures(%i): ID = %i\n", j, rf.ID)结束
p.FevalQueue.RunningFutures(1): ID = 3 p.FevalQueue.RunningFutures(2): ID = 6
在这里,RunningFutures
是一个数组,包含f (1)
而且f (4)
.如果你取消RunningFutures (2)
,你取消了第四个未来f (4)
.
有时,未来在工作空间中不可用,例如,如果您在同一段代码完成之前执行了两次,或者如果您使用parfeval
在函数中。您可以取消工作区中不可用的期货。
清晰的f
从工作空间。
清晰的f
你可以使用RunningFutures
而且QueuedFutures
进入尚未完成的期货。使用RunningFutures
取消f (4)
.
rf2 = p.FevalQueue.RunningFutures(2);取消(rf2) rf2。状态
Ans = 'finished'
要取消队列中的所有期货,请使用以下代码。
取消(p.FevalQueue.QueuedFutures);取消(p.FevalQueue.RunningFutures);