exponenta event banner

parallel.pool. PollableDataQueue

Отправка и опрос данных между клиентом и работниками

    Описание

    PollableDataQueue обеспечивает синхронную отправку и опрос данных или сообщений между работниками и клиентом в параллельном пуле во время выполнения вычисления. Можно получить промежуточные значения и ход выполнения вычислений.

    Чтобы отправить данные от работника параллельного пула обратно клиенту, сначала создайте PollableDataQueue в клиенте. Передать это PollableDataQueue в parfor-loop или другая параллельная языковая конструкция, такая как parfeval. От работников звоните send для отправки данных обратно клиенту. В клиенте, использовать poll для получения результата сообщения или данных, отправленных работником.

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

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

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

    Создание

    Описание

    пример

    p = parallel.pool.PollableDataQueue создает объект, который можно использовать для отправки и опроса сообщений (или данных) от разных работников. Создать PollableDataQueue на работнике или клиенте, где требуется получить данные.

    Свойства

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

    Это свойство доступно только для чтения.

    Число элементов данных, ожидающих удаления из очереди, указанное как нулевое или положительное целое число. Значение: 0 или положительное целое число на работнике или клиенте, создающем PollableDataQueue экземпляр. Если клиент создает PollableDataQueue экземпляр, значение: 0 на всех рабочих. Если работник создает PollableDataQueue, значение равно 0 на клиента и всех остальных работников.

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

    poll Получение данных, отправленных работником
    sendОтправка данных от работника клиенту с помощью очереди данных

    Примеры

    свернуть все

    Построить PollableDataQueue.

    p = parallel.pool.PollableDataQueue;
    

    Начать parfor-loop и отправить сообщение, например данные со значением 1.

    parfor i = 1
        send(p, i); 
    end
    

    Опрос за результат.

    poll(p)
    1
    

    Дополнительные сведения об опросе данных с помощью PollableDataQueue, см. poll.

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

    Когда клиент или работник создает PollableDataQueue все сообщения, отправляемые в очередь, хранятся в памяти этого клиента или работника. Если клиент создает DataQueue объект, QueueLength собственность на всех работников 0. В этом примере создается PollableDataQueue объект на клиенте и отправка данных от работника.

    Сначала создайте параллельный пул с одним работником.

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

    Создать PollableDataQueue.

    pdq = parallel.pool.PollableDataQueue
    pdq = 
      PollableDataQueue with properties:
    
        QueueLength: 0
    
    

    Вновь созданный PollableDataQueue имеет пустую очередь. Вы можете использовать parfor найти pdq.QueueLength на рабочего. Найдите длину очереди на клиенте и длину очереди на работнике.

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

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

    % Send a message first
    parfor i = 1
        send(pdq, 'A message');
    end
    
    % Find the length
    fprintf('On the client: %i\n', pdq.QueueLength)
    On the client: 1
    
    parfor i = 1
        fprintf('On the worker: %i\n', pdq.QueueLength)
    end
    On the worker: 0
    

    QueueLength свойство - 1 на клиенте, и 0 на рабочего. Использовать poll для получения сообщения из очереди.

    msg = poll(pdq);
    disp(msg)
    A message
    

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

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

    QueueLength является 0 поскольку обработка очереди завершена.

    Представлен в R2017a