2013-01-23 3 views
0

나는 Erlang을 처음 사용하기 때문에 두 개의 프로세스가 추가 기능을 실행한다고 가정하고 두 개의 숫자를 에 추가해야합니다. 프로세스 1과 프로세스 ID가 할당 된 값은 프로세스 ID를 보여 주므로 값을 파악해야합니다.Calc 함수에서 add (N) 함수의 반환 값을 읽으려면 어떻게해야합니까?

calc 함수에서 add (N) 함수의 반환 값을 읽으려면 어떻게해야합니까?

-module(myerl). 
-export([calc/1,add/1]). 

add(N) -> 
    N + 5. 


calc(L) 

pone = spawn(fun() -> add(A) end), 
ptwo = spawn(fun() -> add(B) end), 

Result = Pone + Ptwo, 
io:format("result ~p~n", [Result]). 

답변

3

메시지 전달을 사용해야합니다. 결과와 함께 호출 프로세스로 메시지를 보내야합니다. spawn 함수는 새로 생성 된 프로세스에 PID (프로세스 식별자)를 반환하고 실행 결과는 반환하지 않습니다.

이 예제는 기대하고 무엇을 수행해야합니다

calc(A, B) -> 
    Self = self(),  % The spawned funs need a Pid to send to, use a closure 
    POne = spawn(fun() -> Self ! {self(), add(A)} end), 
    PTwo = spawn(fun() -> Self ! {self(), add(B)} end), 
    wait_for_response(POne, PTwo, 0). 

wait_for_response(undefined, undefined, Sum) -> 
    Sum; 
wait_for_response(POne, PTwo, Sum) -> 
    receive 
     {POne, V} -> wait_for_response(undefined, PTwo, Sum + V); 
     {PTwo, V} -> wait_for_response(POne, undefined, Sum + V) 
    end. 
+0

감사합니다. – Shaka

+0

@Shaka 여기서 해결책을 찾은 경우 대답을 받아 들여야합니다. –

2

@Soup 디부 Campbells '설명이 좋다. 나는 본능적으로 약간 다른 것을했는데, 이는 완구 방식으로, 아동 공정과 관련된 나쁜 행동을 예상한다. 또한 입력을 숫자의 목록으로 허용합니다. 2

-module(myerl). 
-export([calc/1, add/1]). 

calc(NumList) when is_list(NumList)-> 
    Parent = self(), 
    _Pids = [spawn(fun()-> Parent ! add(ANum) end) || ANum <- NumList], 
    collect(length(NumList), 0); 
calc(_) -> 
    {error, badarg}. 

collect(0, Sum) -> 
    Sum; 
collect(Cnt, Sum) -> 
    receive 
     N when is_number(N) -> 
      collect(Cnt-1, Sum + N); 
     _Bad -> % returned something that isnt a number 
      collect(Cnt-1, Sum) 
    after 1000 -> % died or is too slow 
     collect(Cnt-1, Sum) 
    end. 

add(N) -> 
    N + 5. 
+0

나는 단순함을 나타내지 만 철저하게 지적했습니다. 비록 당신이 정말로 나쁜 행동을 예상하고 싶다면'spawn_monitor' 나'Parent! '를 사용해야한다는 것을 지적해야만합니다. catch add (ANum)' –

+0

좋은 지적입니다. – Jr0

+0

답장을 보내 주신 Jro님께 감사드립니다. 이 선을 설명해 주시겠습니까? 나는이 부분을 얻지 못했다. ** 대담한 **, '|| ANUM <- NumList> ', – Shaka

관련 문제