2017-04-02 7 views
2

私はプログラミングや新しいerlang(2週間の初心者!私はちょっと編集したので、少なくともそれはコンパイルされ実行されます。しかし、私はまだ、結果を「結合プロセス」に送信して、すべての個別の結果に参加するという概念を理解することはできません。Erlang newbie - 並行性とメッセージの受け渡し

チャンクをカウントするために受け取った「チャンク」を分割して送信します。すべてのプロセスを個別の結果に結び付ける方法を知りません。私は以下のコンセプトを理解していますが、それがどのようにインパメントされているのか分かりません。私は、あなたが行くの出力を同期させる必要があり

など、
-module (ccharcount1d). 
-compile(export_all). 

load(F)-> 
{ok, Bin} = file:read_file(F), 
    List=binary_to_list(Bin), 
    Ls=string:to_lower(List), 
    Length=round(length(List)/20), 
    Collect_Results = spawn(ccharcount1d, collect_results, []), 

    Sl=split(Ls,Length), 

    io:fwrite("Loaded, Split, and sent to multiple processes~n"). 




%%splits txt file into "chunks" and sends those "chunks" to be processed 
split([],_)->[]; 
split(List,Length)-> 
S1=string:substr(List,1,Length), 
case length(List) > Length of 
    true->S2=string:substr(List,Length+1,length(List)), 
    Process_Split = spawn(ccharcount1d,receive_splits,[]), 
    Process_Split ! {self(), S1}; 

    false->S2=[], 
    Process_Split = spawn(ccharcount1d,receive_splits,[]), 
    Process_Split ! {self(), S1} 

end, 

[S1]++split(S2,Length). 


%%recieves the split "chunks" and counts the results 
receive_splits()-> 
    receive 
     {From, S1} -> 
      Result=go(S1) 
      %Collect_Results ! Result 
    end. 



collect_results()-> 
    receive 
     {Process_Split, Result} -> 
      Result=join([],Result) 
    end. 



join([],[])->[]; 
join([],R)->R; 
join([H1 |T1],[H2|T2])-> 
{C,N}=H1, 
{C1,N1}=H2, 
[{C1,N+N1}]++join(T1,T2). 



count(Ch, [],N)->N; 
count(Ch, [H|T],N) -> 
    case Ch==H of 
    true-> count(Ch,T,N+1); 
    false -> count(Ch,T,N) 
end. 

go(L)-> 
Alph=[$a,$b,$c,$d,$e,$f,$g,$h,$i,$j,$k,$l,$m,$n,$o,$p,$q,$r,$s,$t,$u,$v,$w,$x,$y,$z], 
rgo(Alph,L,[]). 

rgo([H|T],L,Result)-> 
N=count(H,L,0), 
Result2=Result++[{[H],N}], 
rgo(T,L,Result2); 


rgo([],L,Result)-> Result. 
+0

と:はるかに簡潔に、このような

[$a,$b,$c,$d,$e,$f,$g,$h,$i,$j,$k,$l,$m,$n,$o,$p,$q,$r,$s,$t,$u,$v,$w,$x,$y,$z] 

"abcdefghijklmnopqrstuvwxyz" 

となおさら、このようなそれはあなたがこれを書くことができることを意味します真新しいエルラン(2週間の初心者!)*私の意見ではひどいアイデア。 Pythonを学んでください。楽しんで1年を過ごし、そこからどこに行きたいかを決めます。 – 7stud

答えて

4

、iは'm new。私はそのコンセプトを理解しています。私は理解していないよ 構文。出力は[$a, $b, $c]が​​と同等であることを示している

8> [$a, $b, $c]. 
"abc" 

9> "abc". 
"abc" 

:どのように

start() -> 
    Work = ..., 
    JoinPid = spawn(fun() -> join_func([]) end), 
    WorkerPid = spawn(fun() -> worker_func(JoinPid, Work) end), %Pass JoinPid to worker process. 
    ... 

join_func(Acc) -> 
    receive 
     Result -> 
      join_func([Result|Acc]); %Recursive function call--the life blood of all functional languages. 

     ... 
    end 

worker_func(JoinPid, Work) -> 
    Result = ... Work ..., 
    JoinPid ! Result. %Worker process uses JoinPid to send back the results. 

を "ワーカープロセスにPIDが渡す" ことも、これをチェックしてください。私はまだプログラミングに新たなんだ*

11> lists:seq(97, 122). 
"abcdefghijklmnopqrstuvwxyz" 
3

をこのポイントにそれを得るために多くの日数と時間しようとしてきたが、それは誤りまたは結合していない変数を取得せずに何もすることができません関数。 私はすべての結果が別のプロセス(receive_results)になっているのを見ているので、goの内部に関数を生成しないでください。

ベストソリューションは、ロード関数内で結果を結合するための1つのプロセスを生成します(このプロセスは、最終結果をロード関数に戻すことができるように、self()を入力として受け取ります)。その結合プロセス参照(J_PID)すべてのチャンクが処理されると終了します。ジョインプロセスを終了するには、節を追加します。終了すると、ジョインプロセスは結果をロード関数に返します。

須藤コード:

J_PID =スポーン参加(自己())
こぼし(J_PID、....)
wait_for_result(結果受信 - > R)を再び

+0

申し訳ありませんが、私はプログラミングに2週間しかありませんし、Erlang、Theresは、あなたが理解するために壊れていると言いました。私が正しく理解している場合は、これを削除する必要があります: DELETE 'rgo([]、L、Result) - >' DELTETE 'Process_Results = spawn(ccharcount1d、receive_results、[]) 、 ' DELETE 'Process_Results! {0}:{(self、)、Result}。 単純に 'rgo([]、L、Result) - > Result.'を入れてください。 – chitown88

+0

ロード関数の' io:format ...)、 '私は結合プロセスを生成することができます。 – chitown88

+0

あなたは私を失ってしまった。私は結果が異なるプロセスに影響しているということを意味しています。しかし、私はかなり理解していない "合流プロセスをワーカープロセスの部分に" – chitown88

関連する問題