主要内容

parallel.pool.dataqueue.

发送和侦听客户端和工人之间的数据

    描述

    一种达图在执行计算时,使得从工人返回到并行池中的Workers的异步发送数据或消息。例如,您可以获得中间值并指示计算进度。

    从并行池返回客户端发送数据,首先构造一个达图在客户。通过这一点达图成一个议案-loop或其他并行语言构造,如SPMD..来自工人,电话发送将数据发送回客户端。在客户端,注册每个时间通过使用时调用的函数after

    • 你可以打电话发送从创建达图, 如果需要的话。

    • 您可以在工人上构建队列,并将其发送回客户端,以便在反向方向上进行通信。但是,您无法将队列从一个工人发送到另一个工人。转移工人之间的数据,使用SPMD.拉布德, 或者LabReceive.反而。

    • 与所有其他句柄对象不同,达图pollabledataqueue.实例在被发送给worker时仍然保持连接。

    创建

    描述

    例子

    问:=并行.Pool.DataQueue.创建一个对象,该对象可用于发送或侦听来自不同工作人员的消息(或数据)。创建达图在您希望接收数据的工作人员或客户端上。

    特性

    全部展开

    此属性是只读的。

    等待从队列中删除的数据项数指定为零或正整数。价值是0.或者在创造的工作人员或客户端上的正整数pollabledataqueue.实例。如果客户端创建pollabledataqueue.实例,值是0.关于所有工人。如果工人创造了pollabledataqueue.,价值是0.在客户和所有其他工人。

    对象功能

    after 定义在DataQueue上接收到新数据时要调用的函数
    发送 使用数据队列向客户端发送数据到客户端

    例子

    全部收缩

    建立A.达图,并打电话after

    q = parallel.pool.DataQueue;afterEach (q, @disp);
    开始一个议案-loop,并发送消息。挂起的消息被传递给after功能,在这个例子中@disp.

    议案我= 1:3发送(q,i);结尾;
    1 2 3.

    要了解更多关于使用达图, 看after

    当您发送消息到a达图对象,消息在队列中等待,直到它由侦听器处理。每条消息都会增加1到队列长度。在此示例中,您使用Queelthength.要找到一个长度的财产达图对象。

    当客户或工人创建一个达图对象时,发送到队列的任何消息都保存在该客户端或工作人员的内存中。如果客户端创建达图对象,呢Queelthength.所有工人的财产是0..在此示例中,您创建了一个达图客户端上的对象,并从工作者发送数据。

    首先,使用一个工人创建一个并行池。

    Parpool(1);
    使用“本地”配置文件启动并行池(Parpool)连接到并行池(工人数量:1)。

    然后,创建一个达图

    q = parallel.pool.DataQueue
    q =具有属性的DataQueue: QueueLength: 0

    一个新创建的达图有一个空队列。您可以使用议案找到q.QueueLength在工人。找到客户端上的队列长度,以及工作人员的队列长度。

    fprintf('在客户上:%i \ n',q.queelthength)
    在客户端:0
    议案我= 1 fprintf('在工人上:%i \ n',q.queelthength)结尾
    在工人上:0

    随着队列是空的,Queelthength.0.对于客户和工人来说。接下来,向工作人员发送队列的消息。然后,使用Queelthength.要查找队列的长度。

    %首先发送消息议案我= 1发送(q,“消息”);结尾%找到长度fprintf('在客户上:%i \ n',q.queelthength)
    在客户上:1
    议案我= 1 fprintf('在工人上:%i \ n',q.queelthength)结尾
    在工人上:0

    Queelthength.属性是1在客户端,和0.在工人。创建一个侦听器,通过立即显示数据来处理队列。

    el = intereach(q,@disp);

    等到队列为空,然后删除侦听器。

    尽管q.queuel长> 0暂停(0.1);结尾删除(el);

    使用Queelthength.要查找队列的长度。

    fprintf('在客户上:%i \ n',q.queelthength)
    在客户端:0

    Queelthength.0.因为队列处理已完成。

    在这个例子中,你使用一个达图以进度更新等待条议案循环。

    当你创建一个议案-loop时,将每个迭代都卸载给并行池中的工作人员。信息只有在议案-loop完成。你可以使用一个达图更新每次迭代结束时的等待条。

    当您使用您的进度更新等待栏时议案-Loop,客户必须记录有关剩余数量迭代的信息。

    提示

    如果您正在创建新的并行代码并希望监视代码的进度,请考虑使用aParfeval.工作流程。有关更多信息,请参阅使用afterEach和afterAll异步更新用户界面

    辅助功能Parfetwaitbar.,更新一个等待条。这个函数使用执着的存储有关剩余迭代次数的信息。

    韦特栏要创建等待栏,W.

    w = waitbar(0,'请稍等 ...');

    创建一个达图D..然后使用after运行Parfetwaitbar.发送消息后达图

    %创建数据线和侦听器d = parallel.pool.dataqueue;intereach(d,@ parfaitbar);

    设置您的迭代次数议案循环,N.使用等待栏W.和迭代的数量N初始化功能Parfetwaitbar.

    在每次迭代的末尾议案-loop,客户端运行Parfetwaitbar.并逐步更新等待栏。

    n = 100;Parfetwaitbar(W,N)

    功能Parfetwaitbar.使用持久变量来存储客户端上已完成的迭代次数。工人不需要任何信息。

    运行一个议案- 播充N迭代。对于此示例,使用暂停兰特模拟一些工作。每次迭代后,使用发送发送消息达图.当发送消息时达图,则等待栏更新。因为不需要工人提供任何信息,所以发送一条空消息,以避免不必要的数据传输。

    之后议案-loop完成,使用删除关闭等待酒吧。

    议案i = 1:n暂停(rand)发送(d,[]);结尾删除(w);

    定义helper函数Parfetwaitbar..当你运行时Parfetwaitbar.使用两个输入参数,该函数初始化三个持久变量(数数H, 和N)。当你运行时Parfetwaitbar.只有一个输入参数,等待栏就会更新。

    功能parforWaitbar (waitbarHandle、迭代)执着的计数H N.如果nargin == 2%初始化count = 0;h = waitbarhandle;n =迭代;别的%更新等待栏%检查句柄是对删除对象的引用如果ISValid(h)count = count + 1;waitbar(count / n,h);结尾结尾结尾

    此示例显示如何执行并行参数扫描Parfeval.并在计算期间发送结果达图对象。Parfeval.不阻止MATLAB,因此您可以在计算发生时继续工作。

    该示例在常微分方程的Lorenz系统上执行参数扫描,参数 σ ρ ,显示了这个系统的混乱本质。

    D. D. T. X = σ y - Z. D. D. T. y = X ρ - Z. - y D. D. T. Z. = xy - β X

    创建参数网格

    定义要在参数扫描中探索的参数范围。

    gridsize = 40;sigma = linspace(5,45,gridsize);rho = linspace(50,100,gridsize);Beta = 8/3;

    创建参数的2-D网格meshgrid.函数。

    [rho,sigma] = meshgrid(rho,sigma);

    创建图形对象,并设置“可见”真的这样它就会在活动脚本之外的新窗口中打开。要可视化参数扫描的结果,创建一个表面图。注意,初始化Z.表面的组分创建一个空的情节。

    数字(“可见”,真正的);表面=冲浪(ρ,σ,南(大小(σ)));包含(‘\ρ“翻译”“泰克斯”)ylabel(‘\σ’“翻译”“泰克斯”

    设置并行环境

    方法创建一个并行工作器池parpool.函数。

    parpool;
    使用“本地”配置文件启动并行池(Parpool)连接到并行池(工人数:6)。

    要从工人发送数据,创建一个达图对象。方法设置一个函数,在每次工作者发送数据时更新表面图after函数。这updatePlot功能是在示例结束时定义的支持万博1manbetx功能。

    q = parallel.pool.dataqueue;intereAp(Q,@(数据)updateplot(表面,数据));

    执行并行参数扫描

    定义参数后,可以执行并行参数扫描。

    Parfeval.在分发工作负载时更有效地工作。要分发工作负载,请将参数分组以探索分区。对于此示例,拆分为大小的均匀分区一步通过使用冒号算子()。得到的阵列分区包含分区的边界。请注意,您必须添加最后一个分区的结束点。

    步骤= 100;分区= [1:步骤:numel(sigma),numel(sigma)+1]
    分区=1×171 101 2011 401 501 601 701 801 901 1001 1101 12011011401 1501 1601

    有关最佳性能,请尝试拆分为以下分区:

    • 与调度分区的开销相比,计算时间大足够大。

    • 足够小,有足够的分区让所有工作人员忙碌。

    要在并行工人上表示函数执行并保存结果,请使用未来的对象。

    f(1:numel(分区)-1)=并行.Fevalfuture;

    通过使用通过使用卸载并行工人的计算Parfeval.函数。参数宽度是在此脚本末尾定义的辅助功能,可以在要探索参数的分区上解决LORENZ系统。它有一个输出参数,因此您必须指定1作为输出的数量Parfeval.

    为了II = 1:numel(分区)-1 f(ii)= parfeval(@ parameterweew,1,分区(ii),分区(ii + 1),sigma,rho,beta,q);结尾

    Parfeval.不阻止MATLAB,因此您可以在计算发生时继续工作。工人并行计算并通过中间结果发送中间结果达图一旦他们可用。

    如果你想阻止matlab直到Parfeval.完成,使用等待在未来的对象上的功能。使用等待当后续代码取决于完成时,功能很有用Parfeval.

    等待(f);

    Parfeval.完成计算,等待完成后,您可以执行更多的代码。例如,绘制结果曲面的轮廓。使用fetchOutputs.函数检索存储在未来对象中的结果。

    结果=重塑(FetchOutputs(F),GridSize,[]);Contourf(rho,sigma,结果)xlabel(‘\ρ“翻译”“泰克斯”)ylabel(‘\σ’“翻译”“泰克斯”

    如果参数扫描需要更多计算资源,并且可以访问集群,则可以扩展Parfeval.计算。有关更多信息,请参阅从桌面缩放到群集

    定义辅助函数

    定义一个辅助函数,可以在要探索的参数的分区上解决Lorenz系统。使用中间结果将中间结果发送到MATLAB客户端发送功能上的达图对象。

    功能结果=参数Weep(首先,最后一个,sigma,rho,beta,q)结果=零(最后第一,1);为了2 =第一:持续1 lorenzSystem = @ (t))(σ(ii) * ((2) - (1));A (1)*(rho(ii) - A (3)) - A (2);(1) *(2) -β* (3)];[t,a] = ode45(lorenzSystem,[0 100],[1 1 1]);结果=(结束,3);发送(Q, [ii,结果]);结果(ii-first + 1) =结果;结尾结尾

    定义另一个辅助函数,在新数据到达时更新曲面图。

    功能updatePlot(surface,data) surface. zdata (data(1)) = data(2);drawnow ('limitrate');结尾
    在R2017A介绍