主要内容

查询和取消parfeval期货

当你使用parfevalparfevalOnAll要在后台运行计算,需要创建名为期货的对象。您可以使用状态属性,以查明它是正在运行、排队还是已完成。你也可以使用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);