IO多路復用

2021-09-25 16:46:39 字數 2874 閱讀 9553

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 往流中讀出資料...