1. 程式人生 > >python學習筆記(66) 非阻塞和多路複用的sever

python學習筆記(66) 非阻塞和多路複用的sever

非阻塞:

import socket
sk = socket.socket()
sk.bind(('127.0.0.1',8080))
sk.setblocking(False)
sk.listen()
conn_l = []
del_conn =[]

while True:
try:
conn,addr = sk.accept()
print('建立連線了:',addr)
conn_l.append(conn)
except BlockingIOError:
for con in conn_l:
try:
msg = con.recv(1024)
if msg == b'':
del_conn.append(con)
continue
print(msg.decode('utf-8'))
con.send(b'bye')
except BlockingIOError:pass

for con in del_conn:
con.close()
conn_l.remove(con)
del_conn.clear()

多路複用:

import socket
import selectors

def accept(sk,mask):
conn,addr = sk.accept()
sel.register(conn,selectors.EVENT_READ,read)

def read(conn,mask):
try:
data = conn.recv(1024)
if not data:
print('closing',conn)
sel.unregister(conn)
conn.close()
return
conn.send(data.upper()+b'_SB')
except Exception:
print('closing',conn)
sel.unregister(conn)
conn.close()



sk = socket.socket()
sk.bind(('127.0.0.1',8080))
sk.listen()
sk.setblocking(False)

sel = selectors.DefaultSelector() # 選擇適合的機制
sel.register(sk,selectors.EVENT_READ,accept)

while True:
events = sel.select() # 檢測所有物件,是否有完成等待資料階段
for sel_obj,maskin in events:
callback = sel_obj.data
callback(sel_obj.fileobj,mask)