Concurrency Erlang newbie-并发和消息传递

Concurrency Erlang newbie-并发和消息传递,concurrency,erlang,spawn,erl,spawning,Concurrency,Erlang,Spawn,Erl,Spawning,我还是个编程新手,全新的erlang 2周新手!。我稍微编辑了一下,这样它至少可以编译并运行。但我仍然无法理解将结果发送到joiner进程以连接所有单独结果的概念 它会分割并发送接收到的数据块来计算数据块。只是不知道如何让所有这些流程加入各自的结果。我有点理解下面的概念,但不知道它是如何实现的。我已经花了很多天和几个小时试图让它达到这一点,但是如果没有错误或未绑定的变量等,我无法让它做任何事情 -module (ccharcount1d). -compile(export_all). load

我还是个编程新手,全新的erlang 2周新手!。我稍微编辑了一下,这样它至少可以编译并运行。但我仍然无法理解将结果发送到joiner进程以连接所有单独结果的概念

它会分割并发送接收到的数据块来计算数据块。只是不知道如何让所有这些流程加入各自的结果。我有点理解下面的概念,但不知道它是如何实现的。我已经花了很多天和几个小时试图让它达到这一点,但是如果没有错误或未绑定的变量等,我无法让它做任何事情

-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.

您需要同步go函数的输出。 不要在go中生成函数,因为我看到所有结果都将进入不同的processreceive_结果

最好的解决方案是只在load函数内生成一个连接结果的进程。该进程将自身作为输入,以便将最终结果发送回load函数。然后将连接进程引用J_PID传递给所有工作进程,这些工作进程将返回结果给连接进程。连接进程是一种接收结果的循环。循环终止处理完所有块后。添加一个子句以终止联接进程。终止时,联接进程将结果发送回加载函数

Sudo代码:

J_PID=生成joinself spiltJ_PID,。。。。
等待结果接收结果->R

您需要同步go函数的输出。 不要在go中生成函数,因为我看到所有结果都将进入不同的processreceive_结果

最好的解决方案是只在load函数内生成一个连接结果的进程。该进程将自身作为输入,以便将最终结果发送回load函数。然后将连接进程引用J_PID传递给所有工作进程,这些工作进程将返回结果给连接进程。连接进程是一种接收结果的循环。循环终止处理完所有块后。添加一个子句以终止联接进程。终止时,联接进程将结果发送回加载函数

Sudo代码:

J_PID=生成joinself spiltJ_PID,。。。。 等待\u结果接收结果->R

再说一次,我是新来的。我理解这个概念。我不明白 语法。如何将Pid传递给工作进程

此外,请查看以下内容:

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

9> "abc".
"abc"
输出显示[$a,$b,$c]相当于abc。这意味着你可以写下:

[$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"
11> lists:seq(97, 122).
"abcdefghijklmnopqrstuvwxyz"
更重要的是,像这样:

"abcdefghijklmnopqrstuvwxyz"
11> lists:seq(97, 122).
"abcdefghijklmnopqrstuvwxyz"
再说一次,我是新来的。我理解这个概念。我不明白 语法。如何将Pid传递给工作进程

此外,请查看以下内容:

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

9> "abc".
"abc"
输出显示[$a,$b,$c]相当于abc。这意味着你可以写下:

[$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"
11> lists:seq(97, 122).
"abcdefghijklmnopqrstuvwxyz"
更重要的是,像这样:

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

好的,对不起,我才开始编程和Erlang两周,你说的有很多我需要崩溃才能理解。我需要做的一件事是,如果我理解正确,我需要删除这个:删除rgo[],L,Result->DELTETE Process\u Results=spawncharcount1d,receive\u Results,[],删除Process\u Results!{self,Result}。只需放置rgo[],L,Result->Result。然后在加载函数中,在io:formatLoad,split…,之后,我就可以生成加入过程。你有点迷路了。我明白你的意思,结果然后被转移到不同的过程。但我不太理解将连接过程传递给工作进程部分要在一个进程中获得结果,将处理块的工作进程应该知道哪个是连接过程,以便它可以将结果发送到该进程。这样所有工作进程都会将结果发送到一个进程。@chitown88,如果您对Erlang有简单的问题,你也可以在网上问。好吧,对不起,我只学了两周编程和Erlang,你说的有很多我需要崩溃才能理解。我需要做的一件事是,如果我理解正确,我需要删除这个:删除rgo[],L,Result->DELTETE Process\u Results=spawncharcount1d,receive\u Results,[],删除Process\u Results!{self,Result}。只需放置rgo[],L,Result->Result。然后在加载函数中,在io:formatLoad,split…,之后,我就可以生成加入过程。你有点迷路了。我明白你的意思,结果然后被转移到不同的过程。但我不太理解将连接过程传递给工作进程部分要在一个进程中获得结果,将处理块的工作进程应该知道哪个是连接过程,以便它可以将结果发送到该进程。这样所有工作进程都会将结果发送到一个进程。@chitown88,如果您对Erlang有简单的问题,你也可以在网上问。我还是一个编程新手和全新的erlang 2周新手!在我看来,这是个糟糕的主意。学习python。花一年的时间享受它,然后决定你想从那里走到哪里。我对编程和全新的erla仍然是新手 ng 2周新手!在我看来,这是个糟糕的主意。学习python。花一年的时间享受它,然后决定你想从那里走到哪里。