2010-03-25 5 views
3

C-Node를 생성해야하는 Erlang 개발 시점입니다 (C-Node 문서의 경우 link 참조). 기본 구현은 간단하지만 문서에 큰 구멍이 있습니다.스레드 된 Erlang C 노드 (cnode) 상호 운용성 howto?

이 코드는 단일 스레드 클라이언트와 서버를 구현합니다. 잠시 동안 클라이언트 무시하기 ... 서버를 구현하는 'c'코드는 단일 스레드이며 한 번에 하나의 erlang 클라이언트에만 연결할 수 있습니다. A의

  1. 실행 EPMD ('EPMD -daemons')
  2. 실행 서버 애플리케이션 ('cserver 1234')
  3. 실행 얼랑 클라이언트 애플리케이션 ('ERL -sname E1 -setcookie secretcookie') 서버가 실행 중인지 3

지금에서 # 얼랑 쉘에서 (') foo는 (3. complex3를') 및 전류 얼랑 쉘가 갖는 다른 윈도우 # 2]와

  • 는 서버에 명령을 실행할 서버에 연결하여 다른 창에서 다시 시도하십시오.

    1. 새로운 창이 열립니다.
    2. erlang 클라이언트를 시작하십시오 ('erl -sname e2 -setcookie secretcookie').
    3. 새 서버 명령 ('complex3 : foo (3).')을 실행하십시오.

    시스템이 멈춘 것처럼 보입니다. 명령이 실행되어야하는 것 같습니다. 다른 erlang 노드가 연결되어 있고 연결을 청취하는 다른 스레드가 없기 때문에 매달린 이유가 있습니다.

    참고 : 연결 처리에 버그가있는 것 같습니다. 수신 블록에 타임 아웃을 추가했는데 잘못된 행동을 잡았지만 완전히받지 못했습니다. 또한 표시된 단계가 수행 된 후 첫 번째 오류 노드를 강제 종료하면 경고 또는 오류없이 cserver를 중단시킬 수있었습니다.

    그래서 질문 ... 스레드 C 노드를 구현하는 가장 좋은 방법은 무엇입니까? 합리적인 수의 연결은 무엇입니까?

  • +0

    크래시의 특성을 확인하기 위해 서버가 SIGPIPE를 수신하고 있음을 보여주는 gdb를 사용하여 코드를 실행했습니다. 나는 그 시그널을 시그널 (SIGPIPE, SIG_IGN)로 방어했다. – Richard

    +0

    이것이 귀하의 질문에 대한 답이라면, 그 질문을 대답에 넣고 그 대답을 "받아들이십시오". 그러면이 질문은 "대답 된"목록에 나타납니다. – ndim

    답변

    3

    cnode tutorial의 cnode 구현 예제는 둘 이상의 연결된 노드를 처리하기위한 것이 아니므로, 처음 증상이 나타나는 것은 정상입니다.

    erl_accept 전화는 들어오는 연결을 허용합니다.

    이 방식으로 작성된 cnode는 하나의 연결 만 허용 한 다음 해당 설명자를 읽기/쓰기 루프에 전달합니다. 그렇기 때문에 fd이 닫힌 소켓을 가리키기 때문에 erl_receive_msg이 실패 할 것이므로 erlang 노드가 닫히면 cnode가 오류로 끝나는 것입니다.

    둘 이상의 인바운드 연결을 허용하려는 경우 연결을 반복 수신하고 둘 이상의 파일 설명자를 처리하는 방법을 구현해야합니다. 다중 쓰레드 프로그램을 필요로하지 않으므로 OS가 지원할 경우 poll 또는 select 시스템 호출을 사용하는 것이 더 쉽고 (그리고 더 효율적일 수 있습니다).

    최적의 연결 수에 대해서는 규칙이 있다고는 생각지 않지만, cnode에서 높은 동시성을 지원하려면 응용 프로그램을 벤치 마크해야합니다. 하지만이 경우 시스템을 다시 설계하여 erlang이 동시성을 처리하고 cnode를 완화 할 수 있습니다.