自定義非同步IO

2022-04-28 20:57:18 字數 4705 閱讀 2028

一:http請求本質阻塞

import socket

import select

client=socket.socket()

client.connect(('www.baidu.com',80))#io阻塞

print("鏈結成功")

data=client.recv(1024)#io阻塞

print(data)

二:http請求本質阻塞

client=socket.socket()

client.setblocking(false)

client.connect(('www.baidu.com',80))#io阻塞

print("鏈結成功")

data=client.recv(1024)#io阻塞

print(data)

**函式:

你到乙個商店買東西,剛好你要的東西沒有貨,於是你在店員那裡留下了你的**,過了幾天店裡有貨了,店員就打了你的**,然後你接到**後就到店裡去取了貨。在這個例子裡,你的**號碼就叫**函式,你把**留給店員就叫登記**函式,店裡後來有貨了叫做觸發了**關聯的事件,店員給你打**叫做呼叫**函式,你到店裡去取貨叫做響應**事件。(by常溪玲)

三:非同步io請求

def f1(data):

print('儲存到資料庫',data)

def f2(data):

print('儲存到檔案',data)

def fileno(self):#自定fileno()方法

return self.socket.fileno()#返回socket的檔案描述符

class asyncrequest(object):

def __init__(self):

self.conn=

self.connection=

def addrequest(self,host,callback):

try:

sk=socket.socket()

sk.setblocking(false)

sk.connect((host,80))

except exception as e:

pass

finally:

sk=httprequest(sk,host,callback)#封裝socket,本質還是呼叫socket的fileno函式,新增**函式

def run(self):

while true:

#rlist表示有人傳送資料

#wlist表示已經和別人鏈結成功

#elist表示鏈結有錯誤

rlist,wlist,elist=select.select(self.conn,self.connection,self.conn,0.05)

#在windows中self.conn為空時,直接報錯,但在linux當中仍會執行

for w in wlist:

print('%s鏈結成功'%w.host)

#新增**函式

urldict=[,,]

request=asyncrequest()

for host in urldict:

request.addrequest(host['host'],host['function'])

request.run()

四:非同步io請求

def f1(data):

print('儲存到資料庫',data)

def f2(data):

print('儲存到檔案',data)

#處理響應資料

headers,body=self.data.split(b'\r\n\r\n',1)#分割請求頭和請求體

self.body=body

headers_list=headers.split(b'\r\n')#將請求頭逐個分開

for head in headers_list:

tmp=head.decode('utf-8').split(':',1)#獲取每個頭的鍵值對

if len(tmp)==2:

self.headers.setdefault(tmp[0],tmp[1])

#封裝socket,新增host屬性,實現filno()方法並返回,socket本身的檔案物件描述符

def fileno(self):#自定fileno()方法

return self.socket.fileno()#返回socket的檔案描述符

#使用select實現io多路復用,請求相應**,拿到返回資料

#rlist表示有人傳送資料

#wlist表示已經和別人鏈結成功

#elist表示鏈結有錯誤

rlist,wlist,elist=select.select(self.conn,self.connection,self.conn,0.05)

#在windows中self.conn為空時,直接報錯,但在linux當中仍會執行

for w in wlist:

print('%s鏈結成功'%w.host)

自定義非同步IO框架

非同步就是 非同步 非阻塞 迴圈 select只能完成io多路復用,不能完成非同步 io多路復用 監聽多個socket物件,這個過程是同步的 利用其特性可以開發非同步模組 非同步io 非阻塞的socket io多路復用 自定義非同步框架 deffileno self select監聽的物件,只要內部...

Python 網路程式設計 自定義實現非同步IO

一.客戶端 1.傳送http請求的本質 import select,socket sk socket.socket 1.連線 io阻塞 80埠是通常預設向http開放的埠,一般使用該埠 如果使用其他埠,需要確保伺服器開啟了相應的埠 print 連線成功 2.傳送請求 自定義封裝http資料報 3.等...

自定義分頁工具 非同步請求

public class pageinfo else if pagesize null pagesize 0 else 2.controller responsebody public ajaxresult index integer pageno,integer pagesize catch ex...