parallel.pool.DataQueue

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

Описание

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

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

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

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

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

Создание

Синтаксис

Описание

пример

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

Свойства

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

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

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

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

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

Примеры

свернуть все

Когда вы отправляете сообщение в DataQueue объект, сообщение ожидает в очереди, пока это не обрабатывается прослушивателем. Каждое сообщение добавляет 1 к длине очереди. В этом примере вы используете QueueLength свойство найти длину DataQueue объект.

Когда процесс MATLAB создает DataQueue объект, любые сообщения, которые отправляются очереди, сохранен в памяти о том процессе. Поэтому QueueLength свойством на всех других процессах является 0. В этом примере вы создаете DataQueue объект на клиенте, и отправляет данные от рабочего.

Во-первых, создайте параллельный пул с одним рабочим.

parpool(1);
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 1).

Затем создайте DataQueue.

q = parallel.pool.DataQueue
q = 
  DataQueue with properties:

    QueueLength: 0

Недавно созданный DataQueue имеет пустую очередь. Можно использовать parfor найти q.QueueLength на рабочем. Найдите длину очереди на клиенте и длину очереди на рабочем.

fprintf('On the client: %i\n', q.QueueLength)
On the client: 0
parfor i = 1
    fprintf('On the worker: %i\n', q.QueueLength)
end
On the worker: 0

Когда очередь пуста, QueueLength 0 и для клиента и для рабочего. Затем отправьте сообщение очереди от рабочего. Затем используйте QueueLength свойство найти длину очереди.

% Send a message first
parfor i = 1
    send(q, 'A message');
end

% Find the length
fprintf('On the client: %i\n', q.QueueLength)
On the client: 1
parfor i = 1
    fprintf('On the worker: %i\n', q.QueueLength)
end
On the worker: 0

QueueLength свойством является 1 на клиенте и 0 на рабочем. Создайте прослушиватель, чтобы обработать очередь путем мгновенного отображения данных.

el = afterEach(q, @disp);

Ожидайте, пока очередь не пуста, затем удалите прослушиватель.

while q.QueueLength > 0
    pause(0.1);
end
delete(el);

Используйте QueueLength свойство найти длину очереди.

fprintf('On the client: %i\n', q.QueueLength)
On the client: 0

QueueLength 0 потому что обработка очереди завершена.

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

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

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

     2

     3

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

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

Создайте a 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 называется.

Создайте a 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