수색…


프로세스 만들기

우리는 spawn 함수를 호출하여 새로운 동시 프로세스를 spawn 합니다. spawn 함수는 매개 변수로 프로세스가 평가할 Fun 함수를 가져옵니다. spawn 함수의 반환 값은 생성 된 프로세스 식별자 (pid)입니다.

1> Fun = fun() -> 2+2 end.
#Fun<erl_eval.20.52032458>
2> Pid = spawn(Fun).
<0.60.0>

spawn/3 을 사용하여 모듈에서 특정 함수 spawn(Module, Function, Args) 실행할 프로세스를 시작할 수도 있습니다.
또는 spawn/2 또는 spawn/4 비슷하게 사용하여 다른 노드 spawn(Node, Fun) 또는 spawn(Node, Module, Function, Args) 에서 프로세스를 시작합니다.

메시지 전달 중

두 개의 프로세스가 서로 통신 할 수 있으며, 메시지 전달 이라고도 합니다 .
이 절차는 메시지를 보낸 후 보내는 프로세스가 중단되지 않는 형태의 비동기식 입니다.

메시지 보내기

이것은 Pid ! Message , Pid 유효한 프로세스 식별자 (PID)이고 Message 어떤 데이터 유형의 값이다.

각 프로세스에는 수신 된 메시지를받은 순서대로 "사서함"이 있습니다. 이 "사서함"은 flush/0 기능으로 빌드하면 비울 수 있습니다.

메시지가 존재하지 않는 프로세스로 전송되면 메시지는 오류없이 버려집니다!

예는 다음과 같을 것입니다. self/0 는 현재 프로세스의 pid를 리턴하고 pid/3 은 pid를 작성합니다.

1> Pidsh = self().
<0.32.0>
2> Pidsh ! hello.
hello
3> flush().
Shell got hello
ok
4> <0.32.0> ! hello.
* 1: syntax error before: ’<’
5> Pidsh2 = pid(0,32,0).
<0.32.0>
6> Pidsh2 ! hello2.
hello2
7> flush().
Shell got hello2
ok

Pid3!Pid2!Pid1!Msg 를 사용하면 한 번에 여러 프로세스에 메시지를 보낼 수도 있습니다.

메시지 수신

수신 된 메시지는 receive 구조로 처리 할 수 ​​있습니다.

receive
  Pattern1            -> exp11, .., exp1n1;
  Pattern2 when Guard -> exp21, .., exp2n2;
  ...
  Other               -> exp31, .., exp3n3;
  ...
  after Timeout       -> exp41, .., exp4n4
end

Pattern 은 첫 번째 및 가장 오래된 메시지로 시작하는 "사서함"의 메시지와 비교됩니다.
패턴이 일치하면 일치하는 메시지가 "mailbox"에서 제거되고 절 본문이 평가됩니다.

after 구조로 타임 아웃을 정의하는 것도 가능하다.
Timeout 은 대기 시간 (밀리 초) 또는 원자 infinity 입니다.

receive 의 리턴 값은 마지막 평가 절 몸체입니다.

예제 (카운터)

메시지를 전달하는 (아주) 간단한 카운터는 다음과 같이 보일 수 있습니다.

-module(counter0).
-export([start/0,loop/1]).

% Creating the counter process.
start() ->
    spawn(counter0, loop, [0]).

% The counter loop.
loop(Val) ->
    receive
        increment ->
           loop(Val + 1)
    end.

카운터와의 상호 작용.

1> C0 = counter0:start().
<0.39.0>
2> C0!increment.
increment
3> C0!increment.
increment

프로세스 등록

프로세스 (pid)를 전역 별명에 등록 할 수 있습니다.
이는 Alias 가 프로세스에 액세스하는 아톰이고 Pid 가 프로세스 ID 인 Build in register(Alias, Pid) 함수를 사용하여 수행 할 수 있습니다.

별칭은 전 세계에서 사용할 수 있습니다!
일반적으로 바람직하지 않은 공유 상태를 만드는 것은 매우 쉽습니다. ( 또한 여기에서보십시오 )

unregister(Pid) 로 프로세스를 unregister(Pid) 하고 whereis(Alias) 별명에서 PID를 수신 할 수 있습니다.

모든 등록 된 별명의 목록은 registered() 를 사용하십시오.

이 예제는 Atom foo를 현재 프로세스의 pid에 등록하고 등록 된 Atom을 사용하여 메시지를 보냅니다.

1> register(foo, self()).
true
2> foo ! 'hello world'.
'hello world'


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow