[Erlang 0076] Erlang Shell 이상 한 질문 입 니 다.

13391 단어 erlang

   요즘 계속 바 빠 요. 가끔 책 을 읽 고 에 너 지 를 보충 할 시간 이 있어 요.최근 에 프로 그래 밍 언어 - 실천 의 길 을 배 우 는 것 이 매우 감개 무량 하 다. 그 전에 잘못 부 딪 힌 소득 은 원래 더욱 체계 적 이 고 완전한 지식 체 계 를 가지 고 있다.그래서 마음 을 가 라 앉 히 고 천천히 흡수 합 니 다. 북상 광 과 같은 도 시 는 우리 의 정력 과 지식 을 빠르게 대사 하고 있 습 니 다. 게 으 름 피 워 서 는 안 됩 니 다. 하지만 조급해 할 필요 도 없습니다. 만약 에 마음 이 경솔 하면 효 과 는 반드시 크게 떨 어 질 것 입 니 다.시간 을 내 서 최근 의 필 기 를 정리 하고 괴이 한 문제 부터 시작 합 시다!
 
  Erlang shell 에서 저 는 메 시 지 를 받 기 를 기다 리 는 프로 세 스 를 만 들 고 테스트 를 합 니 다. 코드: spawn (fun () -> receive after infinity -> io: format ("DONE!") end end). 문제 재현 절차: 1. Erlang Shell 에서 이 프로 세 스 를 시작 한 후 2. 이 프로 세 스에 메 시 지 를 보 냅 니 다. 3. 메시지 추출 논리 가 없 기 때문에,이 프로 세 스 가 받 은 메 시 지 는 메시지 큐 에 쌓 여 있 습 니 다. erlang: process 를 통 해info 보기;먼저 Shell 프로 세 스 를 사용 해 보 세 요. 결 과 는 우리 가 예상 한 것 과 일치 합 니 다.
 
 
23> [self()!abc || _<-lists:seq(1,20)].
[abc,abc,abc,abc,abc,abc,abc,abc,abc,abc,abc,abc,abc,abc,
abc,abc,abc,abc,abc,abc]
24> erlang:process_info(self()).      
[{current_function,{erl_eval,do_apply,6}},
{initial_call,{erlang,apply,2}},
{status,running},
{message_queue_len,20},
{messages,[abc,abc,abc,abc,abc,abc,abc,abc,abc,abc,abc,abc,
            abc,abc,abc,abc,abc,abc,abc,abc]},
{links,[<0.26.0>]},
{dictionary,[]},
{trap_exit,false},
{error_handler,error_handler},
{priority,normal},
{group_leader,<0.25.0>},
{total_heap_size,5168},
{heap_size,2584},
{stack_size,24},
{reductions,68319},
{garbage_collection,[{min_bin_vheap_size,46368},
                      {min_heap_size,233},
                      {fullsweep_after,65535},
                      {minor_gcs,16}]},
{suspending,[]}] 

   다음은 spawn (fun) 방식 으로 시도 해 보 겠 습 니 다. 아래 결 과 를 보 겠 습 니 다. 두 개의 메 시 지 를 보 낸 후에 프로 세 스 상 태 를 보 니 메시지 대기 열 이 비어 있 습 니 다!!!
 
Erlang R15B (erts-5.9) [source] [64-bit] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.9  (abort with ^G)
1> P=spawn(fun() -> receive after infinity-> io:format("dONE!") end end).
<0.34.0>
2> P!abc.
abc
3> P!abcd.
abcd
4> erlang:process_info(P).
[{current_function,{erl_eval,receive_clauses,8}},
{initial_call,{erlang,apply,2}},
{status,waiting},
{message_queue_len,0},
{messages,[]},
{links,[]},
{dictionary,[]},
{trap_exit,false},
{error_handler,error_handler},
{priority,normal},
{group_leader,<0.25.0>},
{total_heap_size,233},
{heap_size,233},
{stack_size,10},
{reductions,26},
{garbage_collection,[{min_bin_vheap_size,46368},
                      {min_heap_size,233},
                      {fullsweep_after,65535},
                      {minor_gcs,0}]},
{suspending,[]}]

 
 
 혹시 이런 표기 법 이 Erlang Shell 에 문제 가 있 나 요?나 는 이 코드 를 테스트 모듈 에 넣 고 시험 해 보 겠 다.
-module(t).
-compile(export_all).

a() -> 
    receive 
         {Data}-> io:format("reveive Data :~p~n ",[Data]),
         a()
    after infinity ->
          io:format("Done!")
    end.

b() -> spawn(fun() -> receive after infinity-> io:format("dONE!") end end). 

 
위의 코드 t: b () 를 실행 하고 메 시 지 를 보 내 고 프로 세 스 상 태 를 확인 합 니 다. $$$~ ~ ~ ~ ~, 보 셨 습 니까? 이 쓰기 메시지 큐 에 서 는 밀 린 메 시 지 를 볼 수 있 습 니 다!!그렇다면 이전의 표기 법, 받 은 소식 은 어디 에 있 습 니까?
 
5> t:b().
<0.39.0>
6> v(5)!abc.
abc
7> v(5)!abcd.
abcd
8> erlang:process_info(v(5)).
[{current_function,{t,'-b/0-fun-0-',0}},
{initial_call,{erlang,apply,2}},
{status,waiting},
{message_queue_len,2},
{messages,[abc,abcd]},
{links,[]},
{dictionary,[]},
{trap_exit,false},
{error_handler,error_handler},
{priority,normal},
{group_leader,<0.25.0>},
{total_heap_size,233},
{heap_size,233},
{stack_size,0},
{reductions,2},
{garbage_collection,[{min_bin_vheap_size,46368},
                      {min_heap_size,233},
                      {fullsweep_after,65535},
                      {minor_gcs,0}]},
{suspending,[]}]

 
   소식 이 어디 있 을 까?또 하나의 방법 이 있 습 니 다. 우 리 는 stacktrace 를 출력 합 니 다. 아래 의 결과 에서 우 리 는 약간의 실 마 리 를 볼 수 있 습 니 다. 프로 세 스 P 의 스 택 정보 에서 y (2) [abcd, abc] 는 바로 전에 우리 가 그것 에 게 보 낸 메시지 입 니 다.t: b () 프로 세 스 를 살 펴 보 았 지만 비슷 한 정 보 를 보지 못 했 습 니 다.대 비 를 통 해 돌파 점 은 여기 있 을 텐 데 프로 세 스 를 찾 지 못 해 고생 이 야dsiplay 출력 정보 에 대한 상세 한 설명 은 계속 하기 어렵 습 니 다. 여기에 기록 하고 나중에 계속 합 니 다.
9> bt(P).
Program counter: 0x00007f738b7d76c0 (erl_eval:receive_clauses/8 + 168)
CP: 0x0000000000000000 (invalid)
arity = 0

0x00007f738d11c2d0 Return addr 0x000000000084e1b8 (<terminate process normally>)
y(0)     []
y(1)     value
y(2)     [abcd,abc]
y(3)     {value,#Fun<shell.7.20862592>}
y(4)     {eval,#Fun<shell.24.20862592>}
y(5)     []
y(6)     {[{call,1,{remote,1,{atom,1,io},{atom,1,format}},[{string,1,"dONE!"}]}],[]}
y(7)     []
y(8)     infinity
ok
10> bt(v(5)).
Program counter: 0x00007f73852f7ec0 (t:'-b/0-fun-0-'/0 + 8)
CP: 0x000000000084e1b8 (<terminate process normally>)
arity = 0
ok
11> 


 
마지막 으로 그림 을 붙 여 올해 은하 이미지 의 작품 운전 자.
 
 
 

좋은 웹페이지 즐겨찾기