python epoll und nicht blockierende

einfache client-server-socket-Studium code,den der server-Ende:

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)

und die client-Ende ist

import socket,time

s = socket.socket()

host = socket.gethostname()
port = 1234

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

Meine Fragen sind:

1.AFAIK in der IO-multiplexing-Modell,epoll.poll blockiert, bis eine Steckdose verfügbar werden,so dass, wenn operiert,es sollte nicht blockiert(sollte direkt zurückzugeben),dann warum sollten wir nennen setblocking(0) in (1),(2),was ist der Zweck? Ich versuchte, legte Sie ab,es funktioniert immer noch

2.wenn ausgeführt wird,die client-Ende kann langsam sein,gibt es 12(das ist die bytes senden server) nach etwa 1s,I-profiling ist es, die durch die Nutzung der Zeit.time() one by one-Anweisung,dann festgestellt, dass das en.connect((host,port)) dauert in der Regel etwa 1s,wo bin ich falsch?(Dies geschieht auf poll/epoll,wenn verwenden auswählen,werden die client-end-geht sehr schnell)

InformationsquelleAutor Nowhy | 2012-10-05
Schreibe einen Kommentar