2017-02-23 8 views
1

처음으로 면책 조항 나는 erlang을 배우고 있습니다. 여기 전문가가 아닙니다. ETS를 사용하여 몇 가지 예를 만들었는데 뭔가 이해가되지 않았습니다 (검색 한 후에도).쉘이 있거나없는 ETS의 다른 작동

난 난 후 다른 프로세스 테이블 ID를 전달

TableID = ets:new(tablename, [public])} 

와 공용 ETS를 생성하는 방법이있다. 이 작업을 수행 할 때 모듈이 쉘을 형성합니다. 모두 괜찮습니다. erl -noshell -s ...와 똑같은 모듈을 실행할 때 또는 -noshell 옵션을 지정하지 않아도 동일한 모듈을 실행할 때 오류가 발생합니다. 오류가 계속 발생합니다 : 표적이 존재하지 않는 것처럼 badarg. ID가 제대로 전달되지만 테이블은 실제로 비공개로 작동합니다!

모듈을 쉘에서 또는 대화 형으로 실행하는 것과 다른 점이 있습니까?

감사


는 내가하려고 사용하고있는 코드의 예를 추가하고 문제를 디버깅하고있다. 그것이 더 큰 소프트웨어의 조각이기 때문에 (그리고 그것은 기본적으로 뼈를 벗겨서 문제를 발견합니다), 이해하기 어려울 수도 있습니다.

-record(loop_state, { 
     commands 
     }). 

start() -> 
    LoopState = #loop_state{commands = ets:new(commands, [public])}, 
    tcpserver_otp_backend:start(?MODULE, 7000, {?MODULE, loop}, LoopState). 

loop(Socket, LoopState = #loop_state{commands = Commands}) -> 
    case gen_tcp:recv(Socket, 0) of 
     {ok, Data} -> 
      % the call below fails, no error generated, AND only in non interactive shell 
      A = newCommand(Commands, Data), 
      gen_tcp:send(Socket, A), 
      loop(Socket, LoopState); 
     {error, closed} -> 
      ok 
    end. 


newCommand(CommandTableId, Command) -> 
    case ets:lookup(CommandTableId,Command) of 
     [] -> 
      _A = ets:insert(CommandTableId, {Command, 1}), 
      <<1, "new", "1">>; % used for testing 
     _ -> 
      <<1, "old", "1">> % used for testing 
    end. 

"불쾌감을주는 명령"을 제거하면 : 룩업은 모든 대화식 셸에서 다시 작동합니다.

+0

오류 상황을 재현하기 위해 관련 코드를 게시 할 수 있습니까? –

+0

완료, 내가 잘못하고있는 부분을 이해하려고 노력하면서 사용하고있는 부분 만 남겨 두었습니다. – Francesco

답변

2

문제는 start() 함수에 ets 테이블을 만드는 것 같습니다. ets 테이블에는 소유자 (기본적으로 생성 프로세스)가 있으며 소유자가 종료되면 테이블이 삭제됩니다. -s를 erl에 전달하여 명령 행에서 start/0 기능을 실행하면 해당 소유자 프로세스가 시작 순서를 처리하는 일부인 Erlang 커널의 일부 내부 프로세스가됩니다. 깔끔한 지 아닌지에 상관없이 조회 프로세스가 실행되기 전에 프로세스가 일시적으로 중단되어 조회가 종료 될 때 테이블이 더 이상 존재하지 않습니다.

ets 테이블을 만드는 적절한 위치는 시작하는 gen_server의 init() 콜백 함수에 있습니다. 여러 프로세스가 액세스하는 공개 est 테이블이되어야하는 경우, 테이블을 소유하는 작업을 가진 별도의 서버 프로세스를 생성하고자 할 수 있습니다.

+0

문제가 해결되면 즉각적인 해결책이라고 생각합니다. 이것이 단지 예일 뿐이라는 것을 감안할 때, 나는 다른 데이터 구조를 사용하거나 자체 프로세스에 ETS를 캡슐화했다. – Francesco

+0

흥미로운 작은 논문이있다. [http://steve.vinoski.net/blog/2011/03/] 23/dont-lose-your-ets-tables /) : "ets 테이블을 잃어 버리지 마라." – Pascal