Erlang Language
프로세스
수색…
프로세스 만들기
우리는 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'