2012-10-05 3 views
0

간단한 클라이언트 - 서버 소켓 공부 코드는 서버 엔드는 다음과 같습니다
1.AFAIK :파이썬의 epoll 및 비 블로킹

import socket,select,time 

s = socket.socket() 

host = socket.gethostname() 
port = 1234 
s.bind((host,port)) 
s.listen(50) 
s.setblocking(0)    # (1) 

fdmap = {s.fileno():s} 

p = select.epoll() 
p.register(s) 
while True: 
    events = p.poll() 
    for fd,event in events: 
     if fd is s.fileno(): 
      c,addr = s.accept() 
      c.setblocking(0)     #(2) 
      print('Got connection from: ',addr) 
      p.register(c) 
      fdmap[c.fileno()] = c 
     elif event & select.EPOLLIN: 
      data = fdmap[fd].recv(1024) 
      if not data: 
       print('disconnected') 
       p.unregister(fd) 
       del fdmap[fd] 
      else: 
       print(data) 

와 클라이언트 엔드

import socket,time 

s = socket.socket() 

host = socket.gethostname() 
port = 1234 

s.connect((host,port)) 
print(s.send(b'hello server')) 

내 질문

이있다 IO 멀티플렉싱 모델에서 epoll.poll은 하나의 소켓이 사용 가능해질 때까지 블로킹 할 것이므로 블럭킹해서는 안된다. (직접 리턴해야한다.) 그러면 왜 (1)에서 setblocking (0)을 호출해야 하는가? (2), 목적은 무엇입니까? 나는 그것들을 내려 놓았지만, 여전히 작동한다.

2. 실행 중일 때, 클라이언트 - 엔드가 느릴 수 있고, 약 1 초 후에 12가 출력되고, 사용 시간으로 프로파일 링한다. 한 번에 한 번씩 statement()를 실행하면 s.connect ((host, port))가 보통 1 초 정도 걸린다는 것을 알게되었는데, 어디서 잘못 되었습니까? (폴/epoll에서 발생합니다. select를 사용하면 클라이언트 쪽이 매우 복잡해집니다.) 빠른

답변

1

당신이 확인하는 경우 documentation는 epoll에 poll 기능이 무한정 대기 의미 -1 기본값 timeout 매개 변수를 취 것을 볼 수 있습니다. 타임 아웃을 0으로 설정하면 즉시 반환됩니다.

connect의 지연은 아마도 connect이 IP 주소를 찾기 위해 호스트 이름의 DNS 조회를 수행해야하기 때문일 수 있습니다.

+0

DNS 조회는'select.epoll'에 대한 지연을 설명하지만'select.select'에 대한 지연을 설명하지 않습니까? –

+0

@MuMind'select.epoll'도'select.select' (또는'select.poll')도 DNS 룩업을하지 않습니다. 그리고'select.epoll' 딜레이는 무슨 소리 죠? –

+0

그들은 s.connect ((host, port))'poll/epoll '에 대해서만 지연이 있지만'select'에 대해서는 매우 빠르다고 말했다. 나는 DNS 룩업을 범인으로 거의 배제 할 것이라고 생각한다. –

관련 문제