Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

parallel.pool.PollableDataQueue

クライアントとワーカーの間でのデータの送信とポーリング

    説明

    PollableDataQueue により、計算の実行中に並列プール内のワーカーとクライアント間でデータまたはメッセージを非同期で送信およびポーリングできます。計算の中間値と進行状況を取得できます。

    並列プールのワーカーからクライアントにデータを送り返すには、まずクライアント内に PollableDataQueue を作成します。この PollableDataQueue を、parfor ループ、または parfeval などの他の並列言語構成に渡します。ワーカーから send を呼び出して、データをクライアントに送り返します。クライアントで poll を使用して、ワーカーから送信されたメッセージまたはデータの結果を取得します。

    • 必要に応じて、PollableDataQueue を作成するワーカーまたはクライアントから send を呼び出すことができます。

    • ワーカー上にキューを作成し、そのキューをクライアントに送り返すことにより、逆方向の通信を有効にできます。ただし、ワーカーから別のワーカーにキューを送信することはできません。代わりに spmdlabSend または labReceive を使用してください。

    • その他すべてのハンドル オブジェクトとは異なり、PollableDataQueue インスタンスと DataQueue インスタンスはワーカーに送信されても接続されたままとなります。

    作成

    説明

    p = parallel.pool.PollableDataQueue は、さまざまなワーカーからのメッセージ (またはデータ) の送信およびポーリングに使用できるオブジェクトを作成します。データを受信するワーカーまたはクライアント上で、PollableDataQueue を作成します。

    プロパティ

    すべて展開する

    このプロパティは読み取り専用です。

    キューからの削除待ちのデータ アイテム数。0 または正の整数として指定します。値は 0 か、または PollableDataQueue インスタンスを作成するワーカーまたはクライアント上では正の整数です。クライアントが PollableDataQueue インスタンスを作成する場合、値はすべてのワーカー上で 0 です。いずれかのワーカーが PollableDataQueue を作成する場合、値はクライアント上およびその他すべてのワーカー上で 0 です。

    オブジェクト関数

    poll ワーカーから送信されたデータの取得
    sendデータ キューを使用したクライアントからワーカーへのデータの送信

    すべて折りたたむ

    PollableDataQueue を作成します。

    p = parallel.pool.PollableDataQueue;
    

    parfor ループを開始し、値 1 を持つデータなどのメッセージを送信します。

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

    結果をポーリングします。

    poll(p)
    1
    

    PollableDataQueue によるデータのポーリングの詳細については、poll を参照してください。

    PollableDataQueue オブジェクトにメッセージを送信すると、メッセージはキューで待機します。メッセージごとに、キューの長さに 1 が加算されます。poll を使用すると、1 つのメッセージがキューから収集されます。この例では、QueueLength プロパティを使用して PollableDataQueue オブジェクトの長さを求めます。

    いずれかのクライアントまたはワーカーが PollableDataQueue オブジェクトを作成すると、キューに送信されたすべてのメッセージはそのクライアントまたはワーカーのメモリに保持されます。クライアントが DataQueue オブジェクトを作成する場合、すべてのワーカー上の QueueLength プロパティは 0 です。この例ではクライアント上に PollableDataQueue オブジェクトを作成し、ワーカーからデータを送信します。

    まず、1 つのワーカーをもつ並列プールを作成します。

    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
    

    キューは空であるため、クライアントとワーカーの両方で QueueLength0 です。次に、メッセージをキューに送信します。続いて、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
    

    キューの処理が完了しているため、QueueLength0 です。

    R2017a で導入