日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Python select及selectors模塊概念用法詳解

瀏覽:159日期:2022-07-20 09:00:43

1. select模塊

針對select,要先理解其他幾個概念:

文件描述符:

文件描述符在形式上是一個非負整數。實際上,它是一個索引值,指向內核為每一個進程所維護的該進程打開文件的記錄表。當程序打開一個現有文件或者創建一個新文件時,內核向進程返回一個文件描述符。

內核空間:

Linux簡化了分段機制,使得虛擬地址與線性地址總是一致,因此,Linux的虛擬地址空間也為0~4G。Linux內核將這4G字節的空間分為兩部分。將最高的1G字節(從虛擬地址0xC0000000到0xFFFFFFFF),供內核使用,稱為“內核空間”。而將較低的3G字節(從虛擬地址 0x00000000到0xBFFFFFFF),供各個進程使用,稱為“用戶空間)。因為每個進程可以通過系統調用進入內核,因此,Linux內核由系統內的所有進程共享。于是,從具體進程的角度來看,每個進程可以擁有4G字節的虛擬空間。

內核空間中存放的是內核代碼和數據,而進程的用戶空間中存放的是用戶程序的代碼和數據。不管是內核空間還是用戶空間,它們都處于虛擬空間中。

內核空間和用戶空間一般通過系統調用進行通信。

select就是針對許多文件描述符(簡稱fd)進行監控,它有三個參數:

rlist -- wait until ready for reading wlist -- wait until ready for writing xlist -- wait for an 'exceptional condition'

第一個參數監控 進來的 數據的fd列表,select監控這個列表,等待這些fd發送過來數據,一旦數據發送過來了(可以讀取了),就返回一個可讀的fd列表

第二個參數監控 出去的 數據的fd列表,select監控這個列表,等待這些fd發送出去數據,一旦fd準備好發送了(可以寫入了),就返回一個可寫的fd列表

第三個參數監控fd列表,返回出異常的fd列表

服務端:

import selectimport socketimport sysimport queue# 生成socket對象server = socket.socket()# 設置非阻塞模式server.setblocking(False)# 綁定地址,設置監聽server.bind((’localhost’,9999))server.listen(5)# 將自己也放進待監測列表里inputs = [server, ]outputs = []message_queues = {}while True: ’’’ 關于socket可讀可寫的判斷,可以參考博客:https://blog.csdn.net/majianfei1023/article/details/45788591 ’’’ rlist, wlist, elist = select.select(inputs,outputs,inputs) #如果沒有任何fd就緒,那程序就會一直阻塞在這里 for r in rlist: # 遍歷已經可以準備讀取數據的 fd if r is server: # 如果這個 fd 是server,即 server 有數據待接收讀取,說明有新的客戶端連接過來了 conn, client_addr = r.accept() print('new connection from',client_addr) conn.setblocking(False) inputs.append(conn) # 將這個新的客戶端連接添加到檢測的列表中 message_queues[conn] = queue.Queue() # 用隊列存儲客戶端發送來的數據,等待服務器統一返回數據 else: # 這個可讀的 r 不是服務器,那就是某個客戶端。就是說客戶端發送數據過來了,這些數據處于待讀取狀態 try: # 異常處理,這是為了防止客戶端異常斷開報錯(比如手動關掉客戶端黑窗口,服務器也會跟著報錯退出)data = r.recv(1024)if data: # 根據判斷data是否為空,判斷客戶端是否斷開 print('收到來自[%s]的數據:' % r.getpeername()[0], data) message_queues[r].put(data) # 收到的數據先放到queue里,一會返回給客戶端 if r not in outputs: outputs.append(r) # 放進可寫的fd列表中,表明這些 fd 已經準備好去發送數據了。else: # 如果數據為空,表明客戶端斷開了 print(’客戶端斷開了’) if r in outputs: outputs.remove(r) # 清理已斷開的連接 inputs.remove(r) # 清理已斷開的連接 del message_queues[r] # 清理已斷開的連接 except ConnectionResetError: # 如果報錯,說明客戶端斷開了print('客戶端異常斷開了', r)if r in outputs: outputs.remove(r) # 清理已斷開的連接inputs.remove(r) # 清理已斷開的連接del message_queues[r] # 清理已斷開的連接 for w in wlist: # 遍歷可寫的 fd 列表,即準備好發送數據的那些fd # 判斷隊列是否為空 try : next_msg = message_queues[w].get_nowait() except queue.Empty: # print('client [%s]' % w.getpeername()[0], 'queue is empty..') outputs.remove(w) # 隊列不為空,就把隊列中的數據改成大寫,原樣發回去 else: # print('sending msg to [%s]'% w.getpeername()[0], next_msg) w.send(next_msg.upper()) for e in elist: # 處理報錯的 fd e.close() print('Error occured in ',e.getpeername()) inputs.remove(e) if e in outputs: outputs.remove(e) del message_queues[e]

客戶端:

import socketimport syssock = socket.socket()sock.connect((’localhost’,9999))while True: c = input(’>>>:’).strip() sock.send(c.encode()) data = sock.recv(1024) print(data.decode())sock.close()

2. selectors模塊

官方文檔:https://docs.python.org/3/library/selectors.html

服務端:

import selectorsimport socket# 根據平臺自動選擇最佳的IO多路機制,比如linux就會選擇epoll,windows會選擇selectsel = selectors.DefaultSelector()def accept(sock, mask): # 建立客戶端連接 conn, addr = sock.accept() print(’accepted’, conn, ’from’, addr) # 設置非阻塞模式 conn.setblocking(False) # 再次注冊一個連接,將其加入監測列表中, sel.register(conn, selectors.EVENT_READ, read)def read(conn, mask): try: # 拋出客戶端強制關閉的異常(如手動關閉客戶端黑窗口) data = conn.recv(1000) # Should be ready if data: print(’echoing’, repr(data), ’to’, conn) conn.send(data) # Hope it won’t block else: print(’Client closed.’, conn) # 將conn從監測列表刪除 sel.unregister(conn) conn.close() except ConnectionResetError: print(’Client forcibly closed.’, conn) # 將conn從監測列表刪除 sel.unregister(conn) conn.close()# 創建socket對象sock = socket.socket()# 綁定端口,設置監聽sock.bind((’localhost’, 1234))sock.listen(100)# 設置為非阻塞模式sock.setblocking(False)# 注冊一個文件對象,監測它的IO事件,data是和文件對象相關的數據(此處放置了一個 accept 函數的內存地址)# register(fileobj, events, data=None)sel.register(sock, selectors.EVENT_READ, accept)while True: ’’’ sel.select() 看似是select方法,實際上會根據平臺自動選擇使用select還是epoll 它返回一個(key, events)元組, key是一個namedtuple類型的元組,可以使用 key.name 獲取元組的數據 key 的內容(fileobj,fd,events,data): fileobj 已經注冊的文件對象 fd 也就是第一個參數的那個文件對象的更底層的文件描述符 events 等待的IO事件 data 可選項。可以存一些和fileobj有關的數據,如 sessioin 的 id ’’’ events = sel.select() # 監測有無活動對象,沒有就阻塞在這里等待 for key, mask in events: # 有活動對象了 callback = key.data # key.data 是注冊時傳遞的 accept 函數 callback(key.fileobj, mask) # key.fileobj 就是傳遞的 socket 對象

客戶端:

import sockettin=socket.socket()tin.connect((’localhost’,1234))while True: inp=input(’>>>>’) tin.send(inp.encode(’utf8’)) data=tin.recv(1024) print(data.decode(’utf8’))

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩亚洲一区在线| 欧美一区久久久| 欧美日韩高清| 在线亚洲免费| 亚洲+小说+欧美+激情+另类| 日本中文字幕一区二区| 国产精品网址| 国产一区二区三区精品在线观看| 日韩成人a**站| 亚洲高清影视| 亚洲精品自拍| 91精品观看| 免费日韩一区二区| 日韩精品成人在线观看| 国产日韩欧美三区| 国产精品不卡| 狠狠操综合网| 91精品国产自产观看在线| 久久中文字幕一区二区三区| 久久中文视频| 亚洲精品第一| 久久亚洲黄色| 久久国产欧美| 日本成人在线一区| 精品亚洲a∨| 亚洲激情五月| 91午夜精品| 日韩视频网站在线观看| 中文字幕亚洲精品乱码| 精品国产亚洲一区二区在线观看| 99久久精品费精品国产| 亚洲人www| 玖玖玖国产精品| 久久99蜜桃| 久久国产影院| 国产日韩一区二区三区在线播放| 成人国产精品久久| 另类综合日韩欧美亚洲| 久久亚洲不卡| 国产不卡一区| 国产农村妇女精品一区二区| 日韩精品久久久久久久软件91| 精品欧美日韩精品| 最新日韩av| 久久免费视频66| 综合五月婷婷| 久久美女性网| 精品国产一区二区三区av片| 免费久久精品视频| 亚洲天堂资源| 91免费精品国偷自产在线在线| 波多野结衣久久精品| 亚欧成人精品| 激情欧美亚洲| 成人午夜网址| 久久激情五月婷婷| 欧美色图一区| 精品国产精品久久一区免费式 | 欧美亚洲国产激情| 国产欧美日韩亚洲一区二区三区| 午夜久久福利| 国产精品亚洲一区二区三区在线观看| 亚洲精品美女| 黑丝一区二区三区| 成人欧美一区二区三区的电影| 免费一级片91| 久久久久久久久丰满| 你懂的国产精品| 午夜在线播放视频欧美| 久久婷婷亚洲| 国产不卡一区| 久久亚洲人体| 国产精品日本一区二区不卡视频 | 亚州av乱码久久精品蜜桃| 国产成人精品亚洲线观看 | 亚洲va在线| 久久av电影| 香蕉久久一区| 视频在线观看一区| 欧美福利一区| 丝袜美腿亚洲色图| 国产二区精品| 久久精品导航| 999国产精品| 日韩中文视频| 久久久久欧美精品| 精品三级av| 国产91在线播放精品| 欧美激情日韩| 美女视频网站久久| 国产一区二区三区视频在线| 国产一卡不卡| 国产日韩高清一区二区三区在线 | 麻豆久久一区| 国产精品视频一区视频二区| 国产精品免费不| 国产九九精品| 久久超级碰碰| 久久精品国产99国产| 久久香蕉精品香蕉| 精品国产乱码久久久久久1区2匹| 久久精品国内一区二区三区| 国产欧美三级| 精品一区二区男人吃奶| 国产成人精品一区二区三区免费 | 久久精品欧洲| 国产在线看片免费视频在线观看| 成人午夜网址| 91tv亚洲精品香蕉国产一区| 久久国产日韩| 亚洲综合精品| 蜜臀久久99精品久久久久宅男| 亚洲精品123区| 婷婷综合一区| 麻豆精品少妇| 精品视频国产| 在线观看精品| 国产亚洲午夜| 欧美影院视频| 国产一区丝袜| 91超碰国产精品| 青草久久视频| 国产粉嫩在线观看| 亚洲欧美久久久| 国产欧美亚洲一区| 中文字幕高清在线播放| 欧美精品高清| 日韩在线卡一卡二| 国产精品日本一区二区三区在线| 国际精品欧美精品| 亚洲激情婷婷| 欧美日韩xxxx| 日韩一区二区三区在线免费观看| 美女精品网站| 精品久久99| 国产精品免费看| 欧美国产专区| 亚洲精品国产偷自在线观看| 欧美视频久久| 久久精品国内一区二区三区水蜜桃| 一区二区三区国产盗摄| 国产日韩高清一区二区三区在线 | 日本91福利区| 欧美日韩免费观看视频| 日韩有吗在线观看| 桃色av一区二区| 最新亚洲国产| 日韩深夜视频| 亚洲精品黄色| 高清一区二区三区av| 男人天堂欧美日韩| 日韩成人免费| 日本一不卡视频| 久久九九精品| 免费精品一区| 一区二区国产在线| 国产高潮在线| 日韩国产在线观看| 日韩激情av在线| 99久久99久久精品国产片果冰| 国产亚洲字幕| 视频一区中文字幕国产| 成人在线丰满少妇av| 最新亚洲国产| 91精品国产成人观看| 国产精品毛片aⅴ一区二区三区| 欧美日韩精品一本二本三本| 国产日韩欧美一区在线| 欧美日韩视频一区二区三区| 精品深夜福利视频| 日韩精品视频一区二区三区| 国产国产精品| 亚洲啊v在线| 你懂的国产精品| 亚洲一二三区视频| 亚洲高清av| 都市激情国产精品| 乱一区二区av| 国产私拍福利精品视频二区| 影院欧美亚洲| 日韩欧美一区二区三区在线视频 | 国产精品毛片一区二区三区| 成人精品高清在线视频| 欧美日韩 国产精品| 亚洲毛片视频| 国产精品美女| 午夜欧美精品久久久久久久| 久久精品91| 亚洲va中文在线播放免费| 麻豆成人91精品二区三区| 国产亚洲高清在线观看| 中文字幕日本一区| 成人av二区| 久久国产欧美| 日韩国产一区| 国产自产自拍视频在线观看| 欧美激情 亚洲a∨综合| 国产欧美一区二区三区米奇 | 亚洲精品精选| 亚洲激情社区|