主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

poll

从可轮询数据队列中检索已发送的数据

说明

data = poll(pollablequeue) 从由 pollablequeue 指定的 parallel.pool.PollableDataQueue 对象中检索一项数据。

  • 如果队列中存在数据,poll 将返回队列中最旧的数据项,即使队列已关闭。

  • 如果队列中没有数据,poll 将返回 []

  • 如果队列已关闭且队列中没有数据,poll 返回 []

示例

data = poll(pollablequeue,timeout) 等待 timeout 秒从 PollableDataQueue 对象 pollablequeue 检索数据。

  • 如果队列中存在数据,poll 将返回队列中最旧的数据项,即使队列已关闭。

  • 如果队列中没有数据,poll 将等待最多 timeout 秒。如果队列在 timeout 秒过去之前收到数据,则 poll 返回该项目。如果在 timeout 秒过去之前队列中没有收到任何数据,则 poll 返回 []

  • 如果队列已关闭或在超时期间关闭且队列中没有数据,poll 不会等待并返回 []

[data,tf] = poll(___) 尝试从队列中检索 data。如果 poll 返回数据,则 tf 为 true。

您可以将此语法与前面语法中的任意输入参量组合一起使用。例如,[data,tf] = poll(pollablequeue,5) 等待五秒钟从队列 pollablequeue 中检索数据。

示例

示例

全部折叠

创建一个 PollableDataQueue 对象。

p = parallel.pool.PollableDataQueue;
运行一个 parfor 循环,并发送一条消息,例如值为 1 的数据。
parfor idx = 1
    send(p,idx); 
end
轮询结果。

poll(p)
1

有关使用 PollableDataQueue 发送数据的更多详细信息,请参阅 send

此示例显示如何将中间结果从工作单元返回到客户端并在客户端上显示结果。

构造一个 PollableDataQueuePollableDataQueue 最适用于在使用 parfevalparfevalOnAll 进行异步函数评估期间发送和轮询数据。

q = parallel.pool.PollableDataQueue;
启动一个计时器,并将数据队列作为输入发送到池上 parfeval 执行的函数。显示经过的时间和返回的数据。

f = parfeval(@workerFcn, 0, q);
msgsReceived = 0;
starttime = tic;
while msgsReceived < 2
    [data, gotMsg] = poll(q, 1);
    if gotMsg
        fprintf('Got message: %s after %.3g seconds\n', ...
            data, toc(starttime));
        msgsReceived = msgsReceived + 1;
    else
        fprintf('No message available at %.3g seconds\n', ...
            toc(starttime));
    end
end

function workerFcn(q)
    send(q,'start');
    pause(3);
    send(q,'stop');
end
Got message: start after 0.39 seconds
No message available at 1.48 seconds
No message available at 2.56 seconds
Got message: stop after 3.35 seconds

执行 parfeval 后 0.39 秒内返回第一条消息。在此期间,parfeval 的数据和函数已被序列化、发送给工作单元、反序列化并设置为运行。当启动代码时,工作单元会发送一些数据,这些数据被序列化,通过网络发送回客户端并放在数据队列中。poll 记录此操作并将值返回给客户端函数。然后显示自调用 parfeval 以来所花费的时间。请注意,当工作单元正在计算某些东西时会有 3 秒的延迟(在这种情况下会暂停很长时间)。

输入参数

全部折叠

可轮询数据队列,指定为 PollableDataQueue 对象。

队列的目标行为由 parallel.pool.PollableDataQueue 函数的 Destination 参量设置,它决定了您可以轮询数据的位置:

  • 如果创建 PollableDataQueue 对象时未设置 Destination 参量,或者将 Destination 设置为 "creator",则只有创建队列的客户端或工作单元才能轮询该队列以接收数据。

  • 如果将 Destination 设置为 "any",则客户端或任何工作单元都可以轮询队列以接收数据。数据在队列中等待,并被发送给轮询队列的客户端或工作单元。

在 R2025a 之前的版本中: 您必须在创建可轮询数据队列的客户端或工作单元中调用 poll

如果您使用 close 函数关闭一个 PollableDataQueue,您将无法再向队列发送数据,但您可以继续从队列中轮询数据。 (自 R2025a 起)

示例: data = poll(pollablequeue);

用于在返回之前阻止 poll 的可选超时间隔(以秒为单位),指定为标量。

示例: data = poll(pollablequeue,timeout);

输出参量

全部折叠

发送到数据队列的消息或数据,以可序列化的值返回。

示例: data = poll(pollablequeue);

标志位用于指定数据是否已返回,以及返回值是逻辑值 true 还是 false

示例: [data,tf] = poll(pollablequeue,timeout);

数据类型: logical

扩展功能

全部展开

版本历史记录

在 R2017a 中推出