多路復用 day37

2022-09-19 22:21:20 字數 2629 閱讀 1495

"""

----多路復用----

指的是多個連線在復用乙個執行緒

反過來說 乙個執行緒處理多個連線

提高了單執行緒處理能

多路復用提公升的 單執行緒處理網路io的效率

協程提公升的是 單執行緒處理所有io的效率

"""

# 多路復用

import

socket

import

select

server =socket.socket()

server.bind((

"127.0.0.1

",21211))

server.listen()

#將服務端設定為非阻塞

#server.setblocking(false)

#select 是幫我們監控連線

#需要給它傳兩個列表 乙個是檢測是否可讀(是否可以執行recv) 乙個是檢測是否可寫(是否可執行send)

rlist =[server,]

wlist =

#預設select是阻塞的 會直到有其中乙個或幾個需要被處理

#儲存要傳送的資料

msg ={}

#返回值

#1.可讀的連線(可以執行recv)

#2.可寫的連線(可以執行send)

while

true:

readable_list,writeable_list,_ =select.select(rlist,wlist,)

#接下來就是要處理這些可讀可寫列表

print

(readable_list)

#處理可讀列表

for c in

readable_list:

if c == server: #

說明當需要被處理的是伺服器

client,addr =c.accept()

#把客戶端也交給select來檢測

else

:

print("

客戶端可以recv啦!")

data = c.recv(1024)

print(data.decode("

utf-8"))

#給客戶端返回資料

#c.send(data.upper())

將客戶端也交給select檢測是否可寫

msg[c] =data

print

(writeable_list)

print

(msg)

#處理可寫列表

for w in

writeable_list:

w.send(msg[w].upper())

#將已經傳送完成的連線從 檢測列表刪除

wlist.remove(w)

# ----多路復用實現原理----
#

----多路復用實現原理----

import

socket

server =socket.socket()

server.bind((

"127.0.0.1

",21211))

server.listen()

server.setblocking(false)

#all clients

clients =

while

true:

try:

client,addr =server.accept()

except

blockingioerror:

#儲存所有已經關閉的客戶端

close_ls =

#儲存所有需要傳送資料的客戶端和資料

msg_ls =

for c in

clients:

try:

data = c.recv(1024)

ifnot

data:

c.close()

#把要傳送資料的 客戶端 和資料儲存到列表中 單獨傳送

except

blockingioerror:

pass

except

connectionreseterror:

c.close()

#處理傳送資料

#已經傳送完成的客戶端和資料

sended_msg =

for client_and_data in

msg_ls:

c =client_and_data[0]

data= client_and_data[1]

try:

c.send(data.upper())

#加入待刪除列表

except

blockingioerror:

pass

#將已經傳送成功的資料從待傳送列表中刪除

for i in

sended_msg:

msg_ls.remove(i)

sended_msg.clear()

#把已經關閉的連線從 所有客戶端列表中刪除

for i in

close_ls:

clients.remove(i)

close_ls.clear()

day10 IO多路復用

io多路復用使用了 select poll epoll方法 監聽socket物件內部是否變化了 當鏈結或者收發訊息的時候會產生變化 服務端conn 判斷是否有新的訊息,其實conn也是乙個socket物件 io多路復用 l 客戶端 author douyunqian coding utf 8 imp...

day37 學習總結

結構 主表 用來約束從表 從表 從表的外來鍵的一列中的元素必須時主表中存在元素,並且存在一列與主表主鍵對應 建立表時新增外來鍵約束 constrict 外鍵名 foreign key 外來鍵欄位名 reference 主表名 主鍵欄位名 已有的表中增加外來鍵約束 alter table 從表 add...

Linux IO多路復用

一.select 函式 include include include int select int n,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout fd clr int fd,fd set set f...