limiter_node の使用

リソースの消費を制限する 1 つの方法は、limiter_node を使用してグラフの指定したポイントを通過するメッセージ数の制限を設定することです。limiter_node のコンストラクターには、最大で 3 つの引数を指定します。

limiter_node( graph &g, size_t threshold, int number_of_decrement_predecessors = 0 )

第 1 引数は、属するグラフへの参照です。第 2 引数は、ノードが着信メッセージを拒否する前に渡すことができるアイテムの最大数を設定します。最後の引数 (デフォルトは 0) は、make_edge の呼び出しによって追加されたデクリメント・ポートを超えることを仮定するサクセサーの数です。

limiter_node は、渡すことができるメッセージの内部カウントを管理します。メッセージが制御されているグラフの部分を離れると、limiter_node のデクリメント・ポートにメッセージを送ってカウントをデクリメントし、さらにメッセージを渡せるようになります。下記の例で、source_node は M 個のビッグ・オブジェクトを生成します。しかし、ここでは、一度に function_node に達するビッグ・オブジェクトを最大 3 つに制限して、source_node が一度に M 個のビッグ・オブジェクトをすべて生成しないようにします。

  graph g;

  int src_count = 0;
  int number_of_objects = 0;
  int max_objects = 3;

  source_node< big_object * > s( g, [&]( big_object* &v ) -> bool {
	  if ( src_count < M ) {
		v = new big_object();
        ++src_count;
        return true;
      } else {
        return false;
      }
  } );

  limiter_node< big_object * > l( g, max_objects );

  function_node< big_object *, continue_msg > f( g, unlimited, 
    []( big_object *v ) -> continue_msg {
	  spin_for(1);
      delete v;
      return continue_msg();
  } );


  make_edge( l, f );
  make_edge( f, l.decrement );
  make_edge( s, l );
  g.wait_for_all();

上記の例は、source_node が一度に M 個のビッグ・オブジェクトをすべて作成しないようにしています。limiter_node にはしきい値 3 が設定されているため、内部カウントが 3 になると着信メッセージは拒否されます。source_node は、メッセージが拒否されると、ボディー・オブジェクトの呼び出しを停止して最後に生成した値を一時的にバッファーに入れます。function_node は、limiter_node のデクリメント・ポートに出力 continue_msg を送ります。そのため、実行を完了した後、limiter_node の内部カウントはデクリメントされます。内部カウントがしきい値よりも低くなると、メッセージは source_node からの送出を再開します。この例では、最大で 4 つのビッグ・オブジェクトが同時に存在します。3 つは limiter_node で渡され、1 つは source_node にバッファーされます。

関連情報