parallel.pool.DataQueue

Класс, который позволяет отправить и прислушаться к данным между клиентом и рабочими

Описание

Очередь данных позволяет отправить данные или сообщения от рабочих назад клиенту в параллельном пуле, в то время как расчет выполняется. Например, можно получить промежуточные значения и индикацию относительно прогресса расчета.

Чтобы отправить данные от параллельного рабочего пула назад клиенту, сначала создайте DataQueue в клиенте. Передайте этот DataQueue в parfor- цикл или другое построение языка параллельного программирования, такое как spmd. От рабочих вызовите send передать данные обратно клиенту. В клиенте зарегистрируйте функцию, которая будет названа каждый раз, когда данные получены при помощи afterEach.

  • Можно вызвать send от процесса, который вызывает конструктора при необходимости.

  • Можно создать очередь на рабочих и передать ее обратно клиенту, чтобы включить коммуникацию в обратном направлении. Однако вы не можете отправить очередь от одного рабочего другому. Используйте spmd, labSend, или labReceive вместо этого.

  • В отличие от всех других объектов указателя, DataQueue экземпляры действительно остаются связанными, когда они отправляются рабочим.

Создание

Синтаксис

Описание

пример

q = parallel.pool.DataQueue не берет аргументов и возвращает объект, который может использоваться, чтобы отправить или прислушаться к сообщениям (или данные) от различных рабочих. Вы вызываете конструктора только в процессе, где вы хотите получить данные. В обычном рабочем процессе рабочие не должны вызывать конструктора, но должны быть вручены существующий DataQueue экземпляр вместо этого.

Свойства

развернуть все

Зависимое свойство на очереди, которая указывает, сколько элементов данных ожидает, чтобы быть удаленными из очереди.

q = parallel.pool.DataQueue;
% No messages in queue because nothing has been sent.
q.QueueLength
ans =

     0
q.send('sending a message')
% Now QueueLength = 1 because one message has been sent.
q.QueueLength
ans =

     1
% Add a callback to process the queue.
listener = q.afterEach(@disp);
sending a message
% Now QueueLength = 0 because there are no more pending messages.
q.QueueLength
ans =

     0
% Data sent now is immediately processed by the callback so that QueueLength remains 0.
q.send('sending message 2')
q.QueueLength
sending message 2

ans =

     0
% Deleting all callback listeners causes messages to build up in the queue again.
delete(listener)
q.send('sending message 3')
q.QueueLength
ans =

     1

Функции объекта

parallel.pool.DataQueue объект имеет следующие методы.

afterEachЗадайте функцию, чтобы вызвать, когда новые данные будут получены на DataQueue
sendОтправьте данные от рабочего клиенту, использующему очередь данных

Примеры

свернуть все

Создайте DataQueue, и вызовите afterEach.

q = parallel.pool.DataQueue;
afterEach(q, @disp);
Запустите parfor- цикл, и отправляет сообщение. Незаконченное сообщение передается afterEach функция, в этом примере @disp.

parfor i = 1:3
    send(q, i); 
end;
     1

     2

     3

Для получения дополнительной информации о прислушивании к данным с помощью DataQueue, смотрите afterEach.

Создайте DataQueue, и используйте afterEach чтобы задать функцию, чтобы выполниться каждый раз, очередь получает данные. Этот пример вызывает подфункцию, которая обновляет панель ожидания.

Создайте parfor- цикл, чтобы выполнить в вычислительном отношении требовательную задачу в MATLAB®. Используйте send отправить некоторые фиктивные данные по каждой итерации parfor- цикл. Когда очередь получает данные, afterEach вызовы nUpdateWaitbar в клиенте MATLAB, и можно наблюдать прогресс панели ожидания.

function a = parforWaitbar

D = parallel.pool.DataQueue;
h = waitbar(0, 'Please wait ...');
afterEach(D, @nUpdateWaitbar);

N = 200;
p = 1;

parfor i = 1:N
    a(i) = max(abs(eig(rand(400))));
    send(D, i);
end

    function nUpdateWaitbar(~)
        waitbar(p/N, h);
        p = p + 1;
    end
end

Если вы вызываете afterEach и существуют элементы на очереди, ожидающей, чтобы быть диспетчеризированными, эти элементы сразу отправлены указателю на функцию, заданному afterEach. Вызовите afterEach перед передающими данными очереди, чтобы гарантировать это на send, указатель на функцию @disp называется.

Создайте DataQueue и вызовите afterEach.

q = parallel.pool.DataQueue;
afterEach(q, @disp);
Если вы затем отправляете сообщения очереди, каждое сообщение передается указателю на функцию, заданному afterEach сразу.

parfor i = 1:3
    send(q, i); 
end
send(q, 0);
     1

     3

     2

     0

Если вы отправляете данные очереди и затем вызываете afterEach, каждое из незаконченных сообщений передается указателю на функцию, заданному afterEach.

q = parallel.pool.DataQueue;
parfor i = 1:3
    send(q, i); 
end
afterEach(q, @disp);
       3

       1

       2

Введенный в R2017a