主要内容

取消

取消排队或运行的未来

语法

描述

例子

取消(F中的已排队和正在运行的期货停止F.对已完成的期货不采取任何行动。对于每个元素F它还没有进入状态“完成”,函数设置其状态财产“完成”,它的错误属性包含MException表示执行被取消。

有些功能和操作是无法被中断的Ctrl + C,如保存.当你使用parfevalparfevalOnAll为了将这些功能和操作卸给工人,取消无法阻止这些未来要停止工作人员执行这些功能和操作,交互式地使用删除函数关闭工作者池。

例子

全部折叠

当你使用parfevalparfevalOnAll要在后台运行计算,需要创建名为futures的对象。你可以使用状态属性,以确定它是正在运行、排队还是已完成。你也可以用theFevalQueue属性来访问正在运行的和排队的期货。要取消期货,可以使用取消函数。在这个例子中,你:

  • 使用取消直接取消期货。

  • 检查已完成期货的完成错误。

  • 使用FevalQueue财产访问期货。

将工作添加到队列

创建并行池p有两个工人。

p = parpool (2);
使用“local”配置文件启动并行池(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正);结束结束

每次使用parfeval返回一个future对象,该对象表示函数在worker上的执行。除了第三个未来,每个未来都需要无限长的时间来计算。未来由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。第二个未来被取消了,正如消息财产。第三个future完成时没有错误,因此没有错误消息。

取消池队列中的期货

你可以使用FevalQueue属性访问池队列中的期货。

p.FevalQueue
ans = FevalQueue,具有属性:编号排队:1编号运行:2

队列有两个属性:RunningFuturesQueuedFutures.的RunningFutures属性是与当前正在运行的任务对应的期货数组。

disp (p.FevalQueue.RunningFutures)
1 x2 FevalFuture数组:ID状态FinishDateTime功能错误  -------------------------------------------------------- 1 12运行@pause 2 15 @pause运行

QueuedFutures属性是与当前排队且未运行的任务对应的期货数组。

disp (p.FevalQueue.QueuedFutures)
FevalFuture with properties: ID: 16 Function: @pause CreateDateTime: 15- jule2020 17:29:37 StartDateTime: Running Duration: 0 days 0h 0m 0s状态:queued Error: none

您可以取消单个期货或一组期货。取消所有的期货QueuedFutures

取消(p.FevalQueue.QueuedFutures);{f。州}
ans =1×5单元{“奔跑”}{'完成'}{'完成'}{“奔跑”}{'完成'}

RunningFuturesQueuedFutures是从最新到最老的排序,不管是否f按最新到最老的顺序排列。每个未来都是独一无二的ID属性的值。检查ID每个期货的财产f

disp (f)
1x5 FevalFuture array: ID State FinishDateTime Function Error -------------------------------------------------------------- 1 12 running @pause 2 13 finished (unread) 15- jul-2020 17:29:37 @pause Error 3 14 finished (unread) 15- jul-2020 17:29:39 @pause 4 15 running @pause 5 16 finished (unread) 15- jul-2020 17:29:39 @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 = 12

在这里,RunningFutures是一个数组,包含f (1)f (4).如果你取消RunningFutures (2),你取消了第四个未来f (4)

有时候,future在工作空间中是不可用的,例如,如果您在同一段代码完成之前执行两次,或者如果您使用parfeval在一个函数。您可以取消工作区中不可用的期货。

清晰的f从工作空间。

清晰的f

您可以使用RunningFuturesQueuedFutures去访问尚未完成的期货。使用RunningFutures取消f (4)

rf2 = p.FevalQueue.RunningFutures (2);取消(rf2) rf2。状态
ans = '完成'

要取消队列中仍然存在的所有期货,请使用以下代码。

取消([p.FevalQueue。RunningFuturesp.FevalQueue.QueuedFutures])

多次运行一个函数,直到找到一个满意的结果。在本例中,当结果大于0.95时,期货F数组将被取消。

N = 100;F(idx) = parfeval(@rand,1);创建一个随机标量结束结果=南;还没有结果。idx = 1:N [~, thisResult] = fetchNext(F);如果thisResult > 0.95 result = thisResult;拥有了所有需要的结果,所以分手。打破结束结束%有要求的结果,取消任何剩余的期货取消(F)的结果

输入参数

全部折叠

对象,返回为平行的。FevalFuture,表示执行fcn并保存它的结果。使用fetchOutputsfetchNext收集结果。

介绍了R2013b