2017-10-08 15 views
0

ノード上にファイルストリームを作成しましたが、ファイルアクセスが心配です。別のノードからストリームを開始するとどうなりますか?別のノードからストリームを開始していますか?

と同様に、ノードAの上に、私はそれを起動せずにストリームを作成します。

stream= File.stream!(path) 
Agent.start(fn -> %{"stream" => stream} end, name: {:global, :my_stream}) 

、その後、ノードBに、私はストリームを開始:

stream= Agent.get({:global, :my_stream}, fn %{"stream" => stream } -> stream end) 
Task.start_link(Stream, :run, [stream]) 

ストリームがファイルをアップになります期待どおりにノードAに? (ノードBはストリームが開始される場所であるとみなして)ファイルがノードAに実際に存在するために失敗した場合、ノードBでそれを探すでしょうか。

ファイルは保存されていますか?どうすればいい?しなければならない?

pathmodesraw、及びline_or_bytes

+0

ここでは「パス」とは何ですか?ファイルの場合は、両方のノードから同じように表示する必要があります。これは、リモートノードでは必ずしも当てはまりません。 – GavinBrelstaff

+0

'path'はファイル(パスを含む)ですが、別のサーバーに各ノードがあるので、私のアプローチは安全ではないと思いますか?または少なくとも、動作保証されていない? – simo

+0

ネットワーク接続されたノードで 'File.stream'を使った私の経験から、各ファイルシステム/ OSに適合した' path'名を持つ各erlang-VM上に、そのファイルのローカルコピーが必要です。作業。 'File'はURLではありません。 – GavinBrelstaff

答えて

0

File.stream! 4つのフィールドが含まFile.Stream構造体を返します。このファイルは、実際にはストリームが実行されたときにのみ開かれます。 Stream.run/1またはいずれかのEnum機能。 を使用してその構造体を別のノードに渡すと、この4つのフィールド構造体だけが渡され、他のノードでStream.runを呼び出すと、そのノードはpathが指すファイルを開こうとします。そのノードのファイルシステム上に存在します。したがって、あなたの質問に対する答えは、ファイルが同じパスに存在しない限り、操作が失敗することです。

一方、Elixirのファイルハンドルは、開いているファイルへの参照を内部的に格納するPIDです。それらは、例えば、 File.open!/1を使用してください。この呼び出しによって返されたPIDを別のノードに渡し、その上で操作を行います。 IO.readFile.readではない)は、ノードに操作がメッセージとしてP​​IDに送信されるため、成功します。 File操作のPIDが別のノードからのものである場合、ファイル操作は透過的に接続を介して転送されます。したがって、このようなファイルにアクセスしたい場合は、別のノードのFile.open!とそれからIO.readを使用できます。

関連する問題