關(guān)于Python三大并發(fā)服務(wù)器的介紹
一、select
select最早于1983年出現(xiàn)在4.2BSD中,它通過一個select()系統(tǒng)調(diào)用來監(jiān)視多個文件描述符的數(shù)組,當(dāng)select()返回后,該數(shù)組中就緒的文件描述符便會被內(nèi)核修改標(biāo)志位,使得進程可以獲得這些文件描述符從而進行后續(xù)的讀寫操作。
select目前幾乎在所有的平臺上支持,其良好跨平臺支持也是它的一個優(yōu)點,事實上從現(xiàn)在看來,這也是它所剩不多的優(yōu)點之一。
select的一個缺點在于單個進程能夠監(jiān)視的文件描述符的數(shù)量存在最大限制,在Linux上一般為1024,不過可以通過修改宏定義甚至重新編譯內(nèi)核的方式提升這一限制。
另外,select()所維護的存儲大量文件描述符的數(shù)據(jù)結(jié)構(gòu),隨著文件描述符數(shù)量的增大,其復(fù)制的開銷也線性增長。同時,由于網(wǎng)絡(luò)響應(yīng)時間的延遲使得大量TCP連接處于非活躍狀態(tài),但調(diào)用select()會對所有socket進行一次線性掃描,所以這也浪費了一定的開銷。
原理:
在python中,select函數(shù)是一個對底層操作系統(tǒng)的直接訪問的接口。它用來監(jiān)控sockets、files和pipes,等待IO完成(WaitingforI/Ocompletion)。當(dāng)有可讀、可寫或是異常事件產(chǎn)生時,select可以很容易的監(jiān)控到。
select.select(rlist,wlist,xlist[,timeout])傳遞三個參數(shù),一個為輸入而觀察的文件對象列表,一個為輸出而觀察的文件對象列表和一個觀察錯誤異常的文件列表。第四個是一個可選參數(shù),表示超時秒數(shù)。其返回3個tuple,每個tuple都是一個準(zhǔn)備好的對象列表,它和前邊的參數(shù)是一樣的順序。下面,主要結(jié)合代碼,簡單說說select的使用。
程序過程:
1、該程序主要是利用socket進行通信,接收客戶端發(fā)送過來的數(shù)據(jù),然后再發(fā)還給客戶端。
2、首先建立一個TCP/IPsocket,并將其設(shè)為非阻塞,然后進行bind和listen。
3、通過select函數(shù)獲取到三種文件列表,分別對每個列表的每個元素進行輪詢,對不同socket進行不同的處理,最外層循環(huán)直到inputs列表為空為止
4、當(dāng)設(shè)置timeout參數(shù)時,如果發(fā)生了超時,select函數(shù)會返回三個空列表。
二、poll
poll在1986年誕生于SystemVRelease3,它和select在本質(zhì)上沒有多大差別,但是poll沒有最大文件描述符數(shù)量的限制。
poll和select同樣存在一個缺點就是,包含大量文件描述符的數(shù)組被整體復(fù)制于用戶態(tài)和內(nèi)核的地址空間之間,而不論這些文件描述符是否就緒,它的開銷隨著文件描述符數(shù)量的增加而線性增大。
另外,select()和poll()將就緒的文件描述符告訴進程后,如果進程沒有對其進行IO操作,那么下次調(diào)用select()和poll()的時候?qū)⒃俅螆蟾孢@些文件描述符,所以它們一般不會丟失就緒的消息,這種方式稱為水平觸發(fā)(LevelTriggered)。
三、epoll
直到Linux2.6才出現(xiàn)了由內(nèi)核直接支持的實現(xiàn)方法,那就是epoll,它幾乎具備了之前所說的一切優(yōu)點,被公認(rèn)為Linux2.6下性能最好的多路I/O就緒通知方法。
epoll可以同時支持水平觸發(fā)和邊緣觸發(fā)(EdgeTriggered,只告訴進程哪些文件描述符剛剛變?yōu)榫途w狀態(tài),它只說一遍,如果我們沒有采取行動,那么它將不會再次告知,這種方式稱為邊緣觸發(fā)),理論上邊緣觸發(fā)的性能要更高一些,但是代碼實現(xiàn)相當(dāng)復(fù)雜。
epoll同樣只告知那些就緒的文件描述符,而且當(dāng)我們調(diào)用epoll_wait()獲得就緒文件描述符時,返回的不是實際的描述符,而是一個代表就緒描述符數(shù)量的值,你只需要去epoll指定的一個數(shù)組中依次取得相應(yīng)數(shù)量的文件描述符即可,這里也使用了內(nèi)存映射(mmap)技術(shù),這樣便徹底省掉了這些文件描述符在系統(tǒng)調(diào)用時復(fù)制的開銷。
另一個本質(zhì)的改進在于epoll采用基于事件的就緒通知方式。在select/poll中,進程只有在調(diào)用一定的方法后,內(nèi)核才對所有監(jiān)視的文件描述符進行掃描,而epoll事先通過epoll_ctl()來注冊一個文件描述符,一旦基于某個文件描述符就緒時,內(nèi)核會采用類似callback的回調(diào)機制,迅速激活這個文件描述符,當(dāng)進程調(diào)用epoll_wait()時便得到通知。

猜你喜歡LIKE
相關(guān)推薦HOT
更多>>
Python如何輸出為文件
python輸出為文件使用withopen()as語句。使用示例:withopen('E:\python\python\test.txt','w')asf:f.writ...詳情>>
2023-11-09 22:08:08
怎么查看python變量的類型
python判斷變量的類型有兩種方法:type()和isinstance()對于基本的數(shù)據(jù)類型兩個的效果都一樣type()ip_port=['219.135.164.245',3128...詳情>>
2023-11-09 21:30:21
python如何生成文件夾
python中可以使用os.makedirs()方法創(chuàng)建多級目錄:os.makedirs()方法用于遞歸創(chuàng)建目錄。像mkdir(),但創(chuàng)建的所有intermediate-level文件夾需要包...詳情>>
2023-11-09 21:11:28
怎樣用python計算矩陣乘法?
python中計算矩陣乘法的方法:1、使用np.multiply()函數(shù)計算矩陣乘法函數(shù)作用:數(shù)組和矩陣對應(yīng)位置相乘,輸出與相乘數(shù)組/矩陣的大小一致示例:n...詳情>>
2023-11-09 20:01:23熱門推薦
python依賴安裝失敗怎么辦
沸怎么把python代碼打包
熱Python如何輸出為文件
熱python如何檢測字符串是不是全為字母?
新怎么查看python變量的類型
python如何生成文件夾
python如何獲取程序執(zhí)行時間?
Python中猴子補丁是什么?
python字典打印亂碼怎么解決
怎樣用python計算矩陣乘法?
python如何調(diào)用另一個文件夾中的內(nèi)容?
python如何去空格和回車?
python使用matplotlib繪圖怎么在線上標(biāo)注?
python3標(biāo)識符是什么?
快速通道 更多>>
-
課程介紹
點擊獲取大綱 -
就業(yè)前景
查看就業(yè)薪資 -
學(xué)習(xí)費用
了解課程價格 -
優(yōu)惠活動
領(lǐng)取優(yōu)惠券 -
學(xué)習(xí)資源
領(lǐng)3000G教程 -
師資團隊
了解師資團隊 -
實戰(zhàn)項目
獲取項目源碼 -
開班地區(qū)
查看來校路線