最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

parallel processing - Update figures from different workers - Stack Overflow

programmeradmin0浏览0评论

i am trying to visualize several parallel processes in matlab. The processes can of course have different update rates. I have implemented a small example for this:

% Clean up environment
clear;
close all;
clc;

% Stop running parallel pools
if ~isempty(gcp('nocreate'))
    delete(gcp('nocreate'));
end

% Create pool with two processes
if isempty(gcp('nocreate'))
    parpool(2);
end

% Define DataQueue and connect function handle to afterEach-function
Q = parallel.pool.DataQueue;
afterEach(Q, @updatePlot);

% Prepare figures
f{1} = figure;
f{2} = figure;
ax{1} = axes(f{1});
ax{2} = axes(f{2});
updatePlot(ax, cell(0));
shg;

% Let the test run for 60 s
timeSec = 60;

% Start two parallel workers
tStart = tic;
spmd(2)
    if spmdIndex == 1
        % Worker 1
        idx = 1;
        while idx < timeSec + 1
            % "Calculate" some data
            r = round(rand * 50) + 5;
            pause(1);

            % Send it to the client
            send(Q, {1 r idx});
            idx = idx + 1;
        end
    end

    if spmdIndex == 2
        % Worker 2
        idx = 1;
        while idx < 2 * timeSec + 1
            % "Calculate" some data
            r = round(rand * 100) + 5;
            pause(0.5);

            % Send it to the client
            send(Q, {2 r idx});
            idx = idx + 1;
        end
    end
end
toc(tStart)
delete(gcp('nocreate'));

% Function to update figures
function updatePlot(varargin)
persistent ax;
persistent s1;
persistent s2;
persistent t1;
persistent t2;

if nargin == 2
    % Initialize
    ax = varargin{1};
    s1 = surfc(ax{1}, [], [], []);
    t1 = title(ax{1}, '');
    axis(ax{1}, 'tight');

    s2 = surfc(ax{2}, [], [], []);
    t2 = title(ax{2}, '');
    axis(ax{2}, 'tight');
else
    % Update plot depending on worker
    if varargin{1}{1} == 1
        values =  rand(varargin{1}{2});

        s1(1).XData = 1:varargin{1}{2};
        s1(2).XData = 1:varargin{1}{2};
        s1(1).YData = 1:varargin{1}{2};
        s1(2).YData = 1:varargin{1}{2};
        s1(1).ZData = values;
        s1(2).ZData = values;

        t1.String = num2str(varargin{1}{3});
        drawnow nocallbacks;

    elseif varargin{1}{1} == 2
        values =  rand(varargin{1}{2});

        s2(1).XData = 1:varargin{1}{2};
        s2(2).XData = 1:varargin{1}{2};
        s2(1).YData = 1:varargin{1}{2};
        s2(2).YData = 1:varargin{1}{2};
        s2(1).ZData = values;
        s2(2).ZData = values;

        t2.String = num2str(varargin{1}{3});
        drawnow nocallbacks;
    end
end
end

Now the figures are not updated according to the update rates. Instead, the figures are only ever updated at the rate of the slowest worker. This means that updates in the figure of the faster worker are basically skipped.

How can I solve this problem so that the update rates of the figures correspond to the update rates of the workers (e.g. if I have a very fast worker and a very slow worker)?

发布评论

评论列表(0)

  1. 暂无评论