Python select解析

2022-06-23 18:21:17 字數 1382 閱讀 6626

一、首先列一下,sellect、poll、epoll三者的區別

1、select

a、select最早於1983年出現在4.2bsd中,它通過一個select()系統呼叫來監控多個檔案描述符的陣列,當select返回後,該陣列中就緒的檔案描述符便會被核心修改標誌位,使得程序可以獲得這些檔案描述符從而進行後續的讀寫操作。

b、select目前幾乎在所有的平臺上支援,其良好跨平臺支援也是它的一個優點,事實上從現在看來,這也是它所剩不多的優點之一。

c、select的一個缺點在於單個程序能夠監視的檔案描述符的數量存在最大限制,在linux上一般為1024,不可以通過修改巨集定義甚至重新編譯核心的方式提升這一限制。

d、另外,select()所維護的儲存大量檔案描述符的資料結構,隨著檔案描述符數量的增大,其複製的開銷也線性增長。同時,由於網路相應時間的延遲使得大量tcp連線處於非活躍狀態,但呼叫select()會對所有

2、poll

a、poll在1986年誕生於system v release3,它和select在本質上沒有多大差別,但是poll沒有最大檔案描述符數量限制。原因是它基於連結串列儲存的。

b、poll和select同樣存在一個缺點就是,包含大量檔案描述符的陣列被整體複製於使用者態和核心的地址空間之間,而不論這些檔案描述符是否就緒,它的開銷隨著檔案描述符數量的增加而線性增大。

c、select()和poll()將就緒的檔案描述符告訴程序後,如果程序沒有對其進行io操作,那麼下次呼叫select()和poll()的時候將再次報告這些檔案描述符,所以他們一般不會丟失就緒的訊息,這種方式稱為水平觸發。

3、epoll

a、直到linux2.6才出現了由核心直接支援的實現方法,那就是epoll,它幾乎具備了之前所說的一切優點,被公認為是linux2.6下效能最好的多路i/o就緒通知方法。

b、epoll可以同時支援水平出發和邊緣觸發(edge triggered,只告訴程序哪些檔案描述符剛剛變為就緒狀態),只說一遍,如果我們沒有採取行動,那麼它將不會再次告知,這種方式稱為邊緣觸發),理論上邊緣觸發的效能要更高一些,但是**實現相當複雜。

c、epoll同樣只告知那些就緒的檔案描述符,而且當我們呼叫epoll_wait()獲得就緒檔案描述符時,返回的不是實際的描述符,而是一個代表就緒描述符數量的值,你只需要去epoll指定的一個陣列中依次取得相應數量的檔案描述符即可,這裡也使用了記憶體對映(mmap)技術,這樣便徹底省掉了這些檔案描述符在系統呼叫時複製的開銷。

d、另一個本質的改進在於epoll採用基於事件的就緒通知方式。在select/poll中,程序只有在呼叫一定的方法後,核心才會對所有監視的檔案 描述符進行掃描,而epoll事先通過epoll_ctl()來註冊一個檔案描述符,一旦基於某個檔案描述符就緒時,核心會採用類似callback的**機制,迅速啟用這個檔案描述符,當程序呼叫epoll_eait()時便得到通知。

select節點clone全解析

2009 12 18 在開發ns log專案中,統計分類有複製的功能。由於之前的統計分類中的資料是通過js賦值進去的,之後使用者可能又進行了修改,發現進行節點克隆時,出現了 無法複製select下拉框值的怪異現象。本文對這個怪異現象進行解析和給出解決辦法。 使用節點的clonenode true fa...

Python解析式

在python中經常能夠看到形如ret x 2 for x in lst 這樣的賦值語句,對於從c 轉到python的人不太容易理解這種for迴圈的使用,這就是python為了簡潔而發明的新語法。python解析式有以下優點 python的解析式具體分為以下四種 下面分別介紹這四種解析式的使用。 列...

python 解析Excel

方法一 通過索引控制第幾行,第幾列帶讀取excel coding utf 8 author date 2018 5 30 16 50 讀寫excel工作表 import xdrlib sys import xlrd filename e pycharmprojects pycharmprojects...