【问题标题】:MATLAB PollableDataQueue get last valueMATLAB PollableDataQueue 获取最后一个值
【发布时间】:2021-12-29 04:29:15
【问题描述】:

是否可以使 MATLAB PollableDataQueue 后进先出 (LIFO) 而不是先进先出 (FIFO)?或者,有没有办法获取队列中的最后一个条目而不是第一个条目?

例如,请参见以下说明 PollableDataQueue 当前行为的代码:

%parpool;

q = parallel.pool.PollableDataQueue;

f = parfeval(@test,1,q);

for jj = 1:4
    poll(q)
    pause(0.25)
end

fetchOutputs(f)
function x0 = test(q)

    x0 = [];
    for jj = 1:20
        x0 = [x0, rand(1)];
        send(q, x0);
        pause(0.01);
        
    end

end

ans =

     []


ans =

    0.7918


ans =

    0.7918    0.1528


ans =

    0.7918    0.1528    0.0854


ans =

  Columns 1 through 12

    0.7918    0.1528    0.0854    0.9955    0.3557    0.1679    0.6713    0.5398    0.6599    0.9344    0.7200    0.4450

  Columns 13 through 20

    0.6622    0.4427    0.9791    0.5114    0.0200    0.6054    0.0479    0.3470

调用“poll(q)”会按照添加到队列 (FIFO) 中的顺序,将添加到 x0 的值一一返回。相反,我想在调用 poll(q) 的那一刻检索队列中的最后一个值。

例如,由于下面的代码在连续调用“poll(q)”之间等待 0.25 秒,并且由于每 0.01 秒将值添加到 x0,我怀疑到第二次“poll(q)”是调用时,应该已经记录了 x0 的第 25 个值。然而,我第二次调用“poll(q)”时只得到第一个条目(FIFO 而不是 LIFO)。

【问题讨论】:

    标签: matlab parfor


    【解决方案1】:

    您可以在 for 循环中使用 while 循环来使队列为空:

    for jj = 1:4
      while q.QueueLength > 0
        x0 = poll(q);
      end
      x0
      pause(0.25)
    end
    

    【讨论】:

    • 嗨 rahnema1 谢谢你,好主意,我意识到轮询实际上很快,所以这可能工作
    • 您也可以使用parallel.pool.DataQueue 并使用带有持久变量的函数来捕获最后一条消息。请参阅链接中的示例。
    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2022-01-16
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    相关资源
    最近更新 更多