主要内容

parallel.pool.dataqueue.

在客户端和工作人员之间发送和监听数据

    描述

    一种DataQueue在执行计算时,允许从工作人员异步地将数据或消息发送回并行池中的客户机。例如,您可以获得中间值和计算进度的指示。

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

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

    • 您可以在工作人员上构造队列,并将其发送回客户机,以启用反向通信。但是,不能将队列从一个工作人员发送到另一个工作人员。要在工作人员之间传输数据,请使用SPMD.labSend,或LabReceive.反而。

    • 与其他句柄对象不同,DataQueuepollabledataqueue.实例发送到工作人员时,它们确实保持连接。

    创建

    描述

    例子

    问:= parallel.pool.DataQueue创建一个对象,该对象可用于发送或侦听来自不同工作者的消息(或数据)。创建DataQueue在要接收数据的工作程序或客户端上。

    属性

    全部展开

    此属性是只读的。

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

    对象功能

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

    例子

    全部收缩

    构造一个DataQueue,并打电话after

    q=parallel.pool.DataQueue;每次之后(q,@disp);
    开始一个议案-循环,并发送消息。挂起的消息将传递给after功能,在这个例子中@disp

    议案I = 1:3 send(q, I);结尾;
    1 2 3

    有关使用DataQueue, 看after

    当你给一个DataQueue对象,消息将在队列中等待,直到侦听器对其进行处理。每条消息都会添加1到队列长度。在此示例中,您使用QueueLength要找到一个长度的财产DataQueue对象。

    当客户或工人创建一个DataQueue对象,则发送到队列的任何消息都保存在该客户端或工作程序的内存中。如果客户端创建DataQueue对象,QueueLength财产归所有工人所有0..在本例中,您创建了一个DataQueue客户端上的对象,并从工作者发送数据。

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

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

    然后,创建一个DataQueue

    q=parallel.pool.DataQueue
    q=具有以下属性的数据队列:QueueLength:0

    新创建的DataQueue有一个空队列。你可以用议案发现q、 队列长度在工人。在客户机上查找队列长度,在worker上查找队列长度。

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

    由于队列是空的,因此QueueLength0.对于客户和工人来说。接下来,向工作人员发送队列的消息。然后,使用QueueLength要查找队列的长度。

    %首先发送消息议案I = 1 send(q,“留言”);结尾求长度fprintf('在客户上:%i \ n',q.queelthength)
    客户端:1 .单击“确定”
    议案我= 1 fprintf(On the worker: %i\n',q.queelthength)结尾
    在工人上:0

    QueueLength财产是1在客户机上,以及0.在工人身上。创建一个侦听器,通过立即显示数据来处理队列。

    el = afterEach(q, @disp);

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

    q.QueueLength > 0暂停(0.1);结尾删除(el);

    使用QueueLength要查找队列的长度。

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

    QueueLength0.因为队列处理已完成。

    在这个例子中,你使用一个DataQueue使用进程更新等待栏的步骤议案-循环。

    当你创建议案-循环,您将每个迭代卸载到并行池中的工作人员。只有在议案循环完成。你可以用DataQueue更新每次迭代结束时的等待条。

    当您更新一个等待条与您的进度议案-Loop,客户必须记录有关剩余数量迭代的信息。

    小费

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

    辅助函数Parfetwaitbar.,在本例末尾定义,更新等待栏。函数使用执着的存储关于剩余迭代次数的信息。

    采用韦特栏要创建一个等待条,W.

    w = waitbar(0,“请等待…”);

    创建一个DataQueueD.. 然后使用after运行Parfetwaitbar.发送消息后DataQueue

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

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

    在项目的每个迭代结束时议案-loop,客户端运行Parfetwaitbar.并逐步更新等待栏。

    n = 100;Parfetwaitbar(W,N)

    这个函数Parfetwaitbar.使用持久变量在客户机上存储已完成的迭代次数。不需要工人提供任何信息。

    经营议案循环与N迭代。对于这个例子,使用暂停兰特模拟一些工作。每次迭代后,使用发送发送消息DataQueue.当消息被发送到DataQueue,等待栏将更新。因为不需要工作人员提供任何信息,所以发送一条空消息以避免不必要的数据传输。

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

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

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

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

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

    该实例对洛伦兹常微分方程组的参数进行了扫描 σ ρ ,并显示了该系统的混沌性质。

    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);β= 8/3;

    使用以下命令创建参数的二维网格:meshgrid.功能。

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

    创建一个图形对象,并设置“可见的”真正的因此,它将在live脚本之外的新窗口中打开。要可视化参数扫描的结果,请创建曲面打印。请注意,初始化Z.表面的分量创建一个空的情节。

    数字(“可见的”,对);表面=表面(rho,sigma,NaN(尺寸(sigma));xlabel(“\rho”“口译员”“特克斯”) ylabel (“\sigma”“口译员”“特克斯”

    设置并行环境

    通过使用parpool.功能。

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

    要从工作者发送数据,请创建DataQueue对象设置一个函数,每当工作人员使用after功能。这个更新包功能是在示例结束时定义的支持金宝app功能。

    Q = parallel.pool.DataQueue;afterEach (Q, @(数据)updatePlot(表面、数据));

    执行并行参数扫描

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

    Parfeval.当您分配工作负载时工作更有效。要分发工作负载,请将参数分组到分区中进行研究。对于本例,将其划分为大小一致的分区通过使用冒号算子().由此产生的数组分区包含分区的边界。注意,必须添加最后一个分区的端点。

    步骤= 100;分区= [1:步骤:numel(sigma),numel(sigma)+1]
    分区=1×171101 201 301 401 501 601 701 801 901 1001 1101 1201 1301 1401 1501 1601

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

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

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

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

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

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

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

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

    如果你想阻止matlab直到Parfeval.完成后,使用等待在未来的对象上的功能。使用等待函数在后续代码依赖于完成时非常有用Parfeval.

    等待(f);

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

    结果=重塑(FetchOutputs(F),GridSize,[]);Contourf(rho,sigma,结果)xlabel(“\rho”“口译员”“特克斯”) ylabel (“\sigma”“口译员”“特克斯”

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

    定义辅助函数

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

    函数result = parameterSweep(first,last,sigma,rho,beta,Q)为了ii=第一个:最后一个洛伦兹系统=@(t,a)[西格玛(ii)*(a(2)-a(1));a(1)*(rho(ii)-a(3))-a(2);a(1)*a(2)-beta*a(3)][t、 a]=ode45(lorenzSystem[01100],[11]);结果=a(结束,3);发送(Q,[ii,结果]);结果(ii第一+1)=结果;结尾结尾

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

    函数updatePlot(surface,data)surface.ZData(data(1))=data(2);抽签('limitrate');结尾
    在R2017A介绍