Thread Pool 관련 문의

ProudNet docs를 참고하고 있습니다. 내용 중 Thread Pool 설정하기에서 몇 가지 질문이 있어 문의드립니다.

1.UserWorkerThreadBeginHandler, UserWorkerThreadEndHandler delegateSetExternalUserWorkerThreadPool를 미설정 했을 때만 호출되는게 맞나요?

CStartServerParameter param;

CThreadPool* p1 = CThreadPool::Create(..., 12);

param.m_externalNetWorkerThreadPool = p1;



2.SetExternalNetWorkerThreadPool만 설정하면 UserWorkerThreadPoolNetWorkerThreadPoolSetExternalNetWorkerThreadPool에 설정된 Thread Pool을 같이 사용하는 건가요?

CStartServerParameter param;

CThreadPool* p = CThreadPool::Create(..., 12);

param.m_externalNetWorkerThreadPool = p;

param.m_externalUserWorkerThreadPool = p;



3.SetExternalNetWorkerThreadPool, SetExternalUserWorkerThreadPool을 설정하지 않은 상태는 NetWorkerThreadPool, UserWorkerThreadPool은 어떤 상태인가요?

3가지 문의에 대한 답변입니다.

  1. 네, 맞습니다. 프라우드넷 내부 스레드 풀만 사용하는 내부에 정의된 스레드 함수에서 해당 콜백을 호출하게 됩니다.

  2. 네, 맞습니다.

  3. 넷워커 스레드 풀과 유저워커 스레드 풀을 합치지 않은 디폴트 상태에서는 서로 각자 독립적인 스레드풀을 사용하고 있습니다만, 넷워커 스레드 풀은 프라우드넷 내부 로직을 처리하는데에만 쓰이고 유저 워커 스레드 풀은 유저가 정의한 RMI 함수들을 처리하는 데에만 쓰입니다.
    양 스레드 풀은 서로 의존 관계가 있습니다. 넷 워커 스레드 풀에서 유저 RMI가 처리해야 될 원격으로 넘어온 데이터들을 조립하여 큐에 넣어두면, 유저 워커 스레드풀에서 큐에 담긴 것을 가져가서 사용합니다.
    때문에 서버의 경우, 넷워커 스레드 풀을 멀티 스레드 모델로 지정하셨지만 유저 워커 스레드 풀은 싱글 스레드 모드로 지정하셨다면, 병목 현상이 발생하여 큐가 계속 늘어나고 일정 수준에 다다르면 경고 메세지가 로그에 찍히게 됩니다.
    덧붙여서 말씀드리자면, 넷워커와 유저워커 스레드풀로 나눈 이유는 유저 RMI 로직에 hang문제가 생겨도 프라우드넷 내부 로직들은 계속 동작하게 하기 위함입니다.