io多路復用用在單執行緒裡,實現併發效果。但其實屬於同步io範疇,是偽併發
常用於網路通訊,和socket搭配使用
第一種:
import socket
import select
import time
sk=socket.socket(
)sk.bind(
("127.0.0.1"
,9904))
sk.listen(5)
while
true
: r,w,e=select.select(
[sk,],
,[],5)
#([監聽的輸入],[監聽的輸入],[監聽的reeor],[輪循監視的時間間隔],)
print
("輪循"
)for i in r:
conn,add=i.accept(
)print
(conn)
print
("hello"
)print
('幹其他事'
) time.sleep(
5)
實現了只能允許乙個客戶端連線,迴圈聊天
'''
上面的**中
???在有乙個客戶端連線的時候,為什麼如果不呼叫accept,會反覆print?
很多答案說是什麼select是水平觸發方式,不太容易理解
首先乙個客戶端連線之後,核心態裡有了乙個sk的雙向鏈結,如果不執行它的accept方法,雙向鏈結一直存在於核心態,未被複製及刪除,所以select每次輪循都會執行for迴圈,自然一直print,傳輸資料同理
'''
第二種方法:
import socket
import select
import time
sk=socket.socket(socket.af_inet,socket.sock_stream)
sk.setblocking(
false
)sk.bind(
("127.0.0.1"
,8801))
sk.listen(5)
inputs=
[sk,
]while
true
: r,w,e=select.select(inputs,
,,5)
for obj in r:
if obj==sk:
conn,add=obj.accept(
)else
: data_byte=obj.recv(
1024
)print
(str
(data_byte,
'utf8'))
inp=
input
('回答%s號客戶》'
%inputs.index(obj)
) obj.sendall(
bytes
(inp,
'utf8'))
print
("這裡可以做其他事情"
)
能允許back_lock個客戶端連線,也能和多個客戶端迴圈聊天,只是乙個客戶端請求到達處理完畢後才能處理下乙個,是一種同步模式(這裡用input來模擬同步效果)
以上都用到select,除此之外,poll和epoll也可以,效能更優
第三種方法:
import selectors
import socket
sel = selectors.defaultselector(
)#根據作業系統選擇最優io多路復用方式
defaccept
(sock, mask)
: conn, addr = sock.accept(
)# should be ready
conn.setblocking(
false
) sel.register(conn, selectors.event_read, read)
defread
(conn, mask)
:try
: data = conn.recv(
1024
)# should be ready
conn.send(data)
# hope it won't block
except exception:
sel.unregister(conn)
conn.close(
)sock = socket.socket(
)sock.bind(
('localhost'
,8090))
sock.listen(
100)
sock.setblocking(
false
)sel.register(sock, selectors.event_read, accept)
#註冊,監聽物件和監聽物件有變化後返回值要執行的函式
while
true
: events = sel.select(
)for key, mask in events:
callback = key.data #key.date是監視物件有變化時返回的函式位址
callback(key.fileobj, mask)
#key。fileobj是返回監視的有變化的物件
借助封裝select的socketserver庫來實現和第二中相同的功能 I O多路復用
一 五種i o模型 1 阻塞i o模型 最流行的i o模型是阻塞i o模型,預設情形下,所有套介面都是阻塞的。我們以資料報套介面為例來講解此模型 我們使用udp而不是tcp作為例子的原因在於就udp而言,資料準備好讀取的概念比較簡單 要麼整個資料報已經收到,要麼還沒有。然而對於tcp來說,諸如套介面...
i o多路復用
最常見的i o多路復用就是 select poll epoll了,下面說說他們的一些特點和區別吧。select 可讀 可寫 異常三種檔案描述符集的申明和初始化。fd set readfds,writefds,exceptionfds fd zero readfds fd zero writefds ...
I O多路復用
我們都知道unix like 世界裡,一切皆檔案,而檔案是什麼呢?檔案就是一串二進位製流而已,不管socket,還是fifo 管道 終端,對我們來說,一切都是檔案,一切都是流。在資訊 交換的過程中,我們都是對這些流進行資料的收發操作,簡稱為i o操作 input and output 往流中讀出資料...