用socket 一定會用到accept recv recvfrom這些方法正常情況下 accept recv recvfrom都是阻塞的
如果setblocking(false) 整個程式就變成乙個非阻塞的程式了非阻塞的特點:沒有併發程式設計的機制是乙個同步的程式
程式不會在某乙個連線的recv或者sk的accept上進行阻塞
缺點:
太多while true 高速執行著
大量的占用了cpu導致了資源的浪費
阻塞io的問題:一旦阻塞就不能做其他事情了
非阻塞io的問題:
給cpu造成了很大的負擔
))sk.setblocking(false) # 設定當前的socket server為乙個非阻塞io模型
sk.listen()
conn_l =
del_l =
while
true:
try:
conn,addr =sk.accept()
except blockingioerror:
for conn in
conn_l: # [conn1,conn2]
try:
conn.send(b
'hello')
print(conn.recv(
1024
)) except (nameerror,blockingioerror):pass
except connectionreseterror:
conn.close()
for del_conn in
del_l:
conn_l.remove(del_conn)
del_l.clear()
io多路復用機制select windows、mac\linux
底層是作業系統的輪詢
有監聽物件個數的限制
隨著監聽物件的個數增加,效率降低
poll mac\linux
底層是作業系統的輪詢
有監聽物件個數的限制,但是比select能監聽的個數多
隨著監聽物件的個數增加,效率降低
epoll mac\linux
給每乙個要監聽的物件都繫結了乙個**函式
不再受到個數增加 效率降低的影響
# 模組 用來操作作業系統中的select(io多路復用)機制
import socket
sk =socket.socket()
sk.bind((
'127.0.0.1
',9000
))sk.setblocking(false)
sk.listen()
r_lst =[sk,]
print(sk)
while
true:
r_l,_,_ = select.select(r_lst,,) # r_lst =[sk,conn1,conn2,conn3]
for item in
r_l:
if item is
sk: conn, addr =sk.accept()
else
:
try:
print(item.recv(
1024
)) item.send(b
'hello')
except connectionreseterror:
item.close()
r_lst.remove(item)
IO模型 多路復用
乙個輸入操作通常包括兩個階段 應用程序被阻塞,直到資料從核心緩衝區複製到應用程序緩衝區中才返回。應該注意到,在阻塞的過程中,其它應用程序還可以執行,因此阻塞不意味著整個作業系統都被阻塞。因為其它應用程序還可以執行,所以不消耗 cpu 時間,這種模型的 cpu 利用率會比較高。應用程序執行系統呼叫之後...
IO模型 io多路復用(三)
兩者相互比較 1 如果只有乙個使用者連線server端,多路復用io還不如阻塞io效率高 2 相比阻塞io,多路復用io中間多了個反饋機制 3 多路復用io的 可以同時監控socket 多個socket物件coon1 coon2.recv 4 多路復用io可以識別有人連線某個coon3,然後告知有c...
IO多路復用 select模型
客戶端 見 c s通訊 伺服器阻塞型使用 伺服器端 include include include include include include include include include include include include int main set local address m...