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)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie das Kontrollkästchen Dokumentation Sie werden sehen, dass die epoll -
poll
- Funktion nimmt einentimeout
parameter, die standardmäßig auf-1
was bedeutet unbegrenzt warten. Wenn Sie den timeout auf null, es wird sofort zurück.Als die Verzögerung in
connect
es ist wahrscheinlich, weilconnect
zu tun hat, ein DNS-lookup des Hostnamens zur IP-Adresse finden.select.epoll
aber nicht fürselect.select
?select.epoll
nochselect.select
(oderselect.poll
) hat jeder DNS-lookups. Und wasselect.epoll
Verzögerung redest du?s.connect((host,port))
hat nur eine Verzögerung fürpoll
/epoll
, aber es geht sehr schnell fürselect
. Ich würde denken, dass wäre so ziemlich ausschließen, DNS-lookups als Täter.