Main Content

parallel.pool.PollableDataQueue

クライアントとワーカーの間でデータの送信およびポーリングを可能にするクラス

説明

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

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

  • 必要に応じて、コンストラクターを呼び出すプロセスから send を呼び出すことができます。

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

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

作成

p = parallel.pool.PollableDataQueue

PollableDataQueue のコンストラクターは引数を取らず、さまざまなワーカーからのメッセージ (またはデータ) の送信またはポーリングに使用できるオブジェクトを返します。データを受信するプロセス内でのみ、コンストラクターを呼び出します。通常のワークフローでは、ワーカーはコンストラクターを呼び出してはならず、代わりに既存の PollableDataQueue インスタンスを渡されなければなりません。

プロパティ

すべて折りたたむ

キューからの削除待ちのデータ アイテム数を示す読み取り専用プロパティ。値は 0 か、または DataQueue インスタンスを作成したプロセス上では正の整数です。その他すべてのプロセスで、値は 0 です。

メソッド

parallel.pool.PollableDataQueue オブジェクトには以下のメソッドがあります。

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

コピーのセマンティクス

ハンドル。コピー操作に対するハンドル クラスの影響については、オブジェクトのコピーを参照してください。

すべて折りたたむ

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

MATLAB プロセスが PollableDataQueue オブジェクトを作成すると、キューに送信されたすべてのメッセージはそのプロセスのメモリに保持されます。したがって、その他すべてのプロセスの 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 です。

PollableDataQueue を作成します。

p = parallel.pool.PollableDataQueue;

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

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

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

poll(p)
1

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

R2017a で導入