PythonStudy 非阻塞IO模型

2022-07-31 10:42:15 字數 1834 閱讀 8478

服務端

import

socket

import

time

import

select

server =socket.socket()

server.bind((

"127.0.0.1

",1688))

server.listen(5)

#server.setblocking(false) # 預設為阻塞 設定為false 表示非阻塞

"""引數1 rlist 裡面儲存需要被檢測是否可讀(是否可以執行recv)的socket物件

引數2 wlist 裡面儲存需要被檢測是否可寫(是否可以執行send)的socket物件

引數3 xlist 儲存你需要關注異常條件 忽略即可

引數4 timeout 檢測超時時間 一段時間後還是沒有可以被處理的socket 那就返回空列表

返回值: 三個列表

1 已經有資料到達的socket物件

2 可以傳送資料的socket物件 怎麼可以發 緩衝區沒有滿

3 忽略....

"""rlist =[server,]

wlist =

#要傳送的資料和socket

msgs =

while

true:

ras,was,_ = select.select(rlist,wlist,) #

阻塞直到socket可讀或是可寫

#處理可讀的socket

for s in

ras:

if s ==server:

client,addr =server.accept()

else

:

try:

#收資料

data = s.recv(2048)

ifnot

data:

raise

connectionreseterror()

#s.send(data.upper())

#將要傳送的資料和socket 儲存起來

except

connectionreseterror:

s.close()

rlist.remove(s)

if s in

wlist:wlist.remove(s)

#處理可寫的socket

for s in

was:

for msg in

msgs[:]:

if msg[0] ==s:

s.send(msg[1].upper())

#傳送成功之後 刪除已經無用的資料 並且需要將socket從wlist列表中刪除

#不刪除會造成死迴圈 因為socket 一直處於可寫狀態

msgs.remove(msg)

wlist.remove(s)

客戶端

import

osimport

socket

client =socket.socket()

client.connect((

"127.0.0.1

",1688))

while

true:

msg = input("

msg:")

ifnot msg:continue

client.send(msg.encode(

"utf-8"))

print(client.recv(2048).decode("

utf-8

"))

python socket併發模型 非阻塞IO

設定將原本阻塞io變為非阻塞io 方法1 sockfd.setblocking bool 方法2 sockfd.settimeout sec from socket import from time import ctime,sleep f open log.txt a 日誌檔案 s socket ...

阻塞 非阻塞

阻塞和非阻塞指 的是在接收和傳送時是否等待動作完成才返回 舉例 阻塞 block 是指,你撥通某人 的 但是此人不在,於是你拿著 等他回來,其間不能再用 非阻塞 nonblock 是指,你撥通某人 的 但是此人不在,於是你結束通話 待會兒再打。至於到時候他回來沒有,只有打了 才知道。即所謂的 輪詢 ...

阻塞非阻塞

阻塞和非阻塞 阻塞 可用在assign語句和always語句中,表示只要源訊號發生變化,目標訊號就立刻完成賦值操作,在always塊中,結果與語句順序有關,在always塊中是順序關係 非阻塞 只能用在always語句中,表示該語句結束時完成賦值操作,結果與語句順序無關,並行關係 可以這樣理解 阻塞...