epoll 서버 예제

epoll API의 전체 프레젠테이션은 여기에 목표가 아닙니다 – 이를 위한 많은 온라인 리소스가 있습니다. 당신이 짐작할 수 있듯이, 그래도, 나는 우리의 동시 서버의 또 다른 버전을 작성하려고합니다 – 선택 대신 에폴을 사용하여이 시간. 전체 코드 샘플은 여기. 사실, 코드의 대부분은 선택 서버와 동일하기 때문에, 나는 단지 참신에 초점을 맞출 것이다 – 메인 루프에서 전자 조사의 사용 : 서버 : #//사용자/빈/envpython#… lxy210781 이 경우, 구성은 우리를 위해 보고 있는 설명자 epoll에 청취 소켓을 추가하는 양이다. 그런 다음 수정을 위해 epoll에 전달할 준비 된 이벤트의 버퍼를 할당합니다. 메인 루프에서 epoll_wait에 대한 호출은 마법이 있는 곳입니다. 감시된 설명자 중 하나가 준비될 때까지(또는 시간 시간이 만료될 때까지) 차단하고 준비된 설명자 수를 반환합니다. 그러나 이번에는 모든 시청된 집합을 맹목적으로 반복하는 대신 epoll_write가 0에서 nready-1까지 준비된 이벤트로 전달된 이벤트 버퍼를 채웠다는 것을 알고 있으므로 엄격하게 필요한 횟수만 반복합니다. 완전한 예로 select를 사용하는 동시 서버에서 프로토콜을 다시 구현했습니다. 전체 코드는 여기; 다음은 설명과 함께 코드의 몇 가지 하이라이트입니다.

경고: 이 코드 샘플은 상당히 실질적이기 때문에 시간이 부족하다면 첫 번째 읽기에서 건너 뛸 수 있습니다. 그래서 선택은 동기 멀티플렉싱입니다. 그러나 비동기 서버의 예로 select를 사용하여 실질적인 코드 샘플을 제공했습니다. 무엇을 제공합니까? 당신이 볼 수 있듯이, epoll() API는 매우 간단하지만 날 믿어, 그것은 매우 강력하다. 선형 확장성을 사용하면 연결당 클래식 한 스레드와 비교하여 작업자 프로세스의 작은 amout을 사용하여 엄청난 양의 병렬 연결을 관리할 수 있습니다. 대부분의 코드는 선택 서버에 이미 익숙하기 때문에 간단합니다. 실제로 대폴 서버의 모든 “비즈니스 논리”는 선택 서버와 동일합니다. nginx-pollepollà수락, ngx_accept_disabled=ngx_cycle->연결_n/8-ngx_cycle-free_… 스레드 된 경우와 유사하게 deusomax의 경우, 클라이언트 간에 지연이 없습니다 – 그들은 모두 동시에 처리됩니다.

그러나 선택 서버에는 스레드가 보이지 않습니다! 메인 루프는 select를 사용하여 여러 소켓을 효율적으로 폴링하여 모든 클라이언트를 멀티플렉싱합니다.