2017-05-17 11 views
2

私は(F#で記述されたが、Scalaのバージョンが異なると一致していない)アッカストリームのための簡単なテストコードを持っている:なぜKeep.NoneはAkkaストリームの実行結果に影響しませんか?

var source = Source.From(Enumerable.Range(1, 3)); 
    var flow = Flow.FromFunction(new Func<int, string>(x => (x * 2).ToString())); 
    var sink = Sink.ForEach<string>(output.Add); 
    var runnable = source.Via(flow).To(sink); 

経由のヘルパーメソッドがViaMaterializedのためだけのショートカットですので(、Keep.Leftフロー)私はこのようなコードを書き換えることができます。

var source = Source.From(Enumerable.Range(1, 3)); 
var flow = Flow.FromFunction(new Func<int, string>(x => (x * 2).ToString())); 
var sink = Sink.ForEach<string>(output.Add); 
var runnable = source.ViaMaterialized(flow, Keep.Left).To(sink); 

は(左、右、両方またはNone)プロパティをキープストリーム動作の指定された側の値を保存すべきであるストリームmaterializerを伝えます。しかし、Keep.LeftをKeepに変更すると気付きます。Right、Keep。どちらか、またはKeepを保持します。実行結果の何も変更しません。シンクは常にフロー変換関数に従って出力を受け取ります。

私は、値が確実にシンクに送られるようにするには、ストリームグラフのFlowステージにNone以外の値を使用する必要があると考えました。私はこのことの意味を誤解しているに違いないので、私の質問は、両面で物質化が無効になっていてもストリームフローが機能する理由です。 Left、Right、Both、Noneの間でKeep値を変更すると、シンクに到達する値に影響を与える例を挙げることができますか?

+2

これらのコードスニペットはF#ではなくC#にあります。 –

答えて

3

ストリームがマテリアライズされ、そのストリームにマテリアライズされた値があるという事実を混乱させます。

フロー(または、より一般的にはグラフ)はストリームの青写真です。実行可能なグラフでrun()メソッドを使用すると、この青写真を使用してストリームがマテリアライズされます。このストリームは、マテリアライズされた値を考慮せずに、それが期待されるものであれば何でも行います。

実体化された値とは何ですか?メソッドrun()を使用すると、値が返されます。これがストリームの具体化された価値です。ほとんどの場合(単純なビルトインステージの場合)、マテリアライズされた値は重要ではありません(scalaではNotUsedと呼ばれ、.NETについてはわかりません)。重大でない例は、として具体化されたSink.ignoreです。これは、マテリアライズした特定のストリームが入力を完全に消費した(またはエラーがスローされた)ときに処理を行います。より一般的には、マテリアライズされた値は、あなたのストリームに何が起こっているのかに関する状況情報を提供します(このステートメントの漠然としたことについては申し訳ありませんが、

グラフを作成するときに、すべて異なる実体化された値を持つ異なる要素をまとめます。実行可能なグラフには1つしか持てないので、何らかの方法で組み合わせる必要があります。 Keep.{right, left, both, none}は、値の1つだけ、またはその両方を保持するか、またはnoneを保持することによってこれらの値を組み合わせる単純な関数です。ただし、グラフを保持しない場合でも、両方のグラフがマテリアライズされ、値が生成されるという事実は変わりません。

+0

ありがとうございます。私は実際に別のものを混乱させた。今それは明らかです。 –

3

Keep.*機能は、マテリアライゼーションプロセス自体に影響を与えません。

より具体的には、マテリア時間(すなわちrun()が呼び出されたとき)に、それぞれ自分のストリームのすべての段階(あなたの例では、ソースは、流れとシンク)常にマテリアライズドされ - したがって、下の実体化値を生成しますフード。最後の型パラメータからその値がどうなるかをはっきりと確認できます。利用者の利便性のため

、最も可能性が高いとあなたが 程度を保つものを選択するために、それに応じて Keep.*を使用することができ、それらのすべてに興味がありません。これは返品タイプ run()に直接反映されます。

+0

ありがとうございます。 –

関連する問題