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를 사용하면 클라이언트 쪽이 매우 복잡해집니다.) 빠른
DNS 조회는'select.epoll'에 대한 지연을 설명하지만'select.select'에 대한 지연을 설명하지 않습니까? –
@MuMind'select.epoll'도'select.select' (또는'select.poll')도 DNS 룩업을하지 않습니다. 그리고'select.epoll' 딜레이는 무슨 소리 죠? –
그들은 s.connect ((host, port))'poll/epoll '에 대해서만 지연이 있지만'select'에 대해서는 매우 빠르다고 말했다. 나는 DNS 룩업을 범인으로 거의 배제 할 것이라고 생각한다. –