伺服器select與gevent

2021-08-07 03:22:25 字數 1024 閱讀 7246

select版-tcp伺服器

1. select 原理

在多路復用的模型中,比較常用的有select模型和epoll模型。這兩個都是系統介面,由作業系統提供。當然,python的select模組進行了更高階的封裝。

將需要判斷有資料傳來的(可讀的)socket、可以向外傳送資料的(可寫的)socket及發生異常狀態的socket交給select,select會幫助我們從中遍歷找出有事件發生的socket,並返回給我們,我們可以直接處理這些發生事件的socket。

2. 總結優點

select目前幾乎在所有的平台上支援,其良好跨平台支援也是它的乙個優點。缺點

select的乙個缺點在於單個程序能夠監視的檔案描述符的數量存在最大限制,在linux上一般為1024,可以通過修改巨集定義甚至重新編譯核心的方式提公升這一限制,但是這樣也會造成效率的降低。

一般來說這個數目和系統記憶體關係很大,具體數目可以cat /proc/sys/fs/file-max察看。

32位機預設是1024個。64位機預設是2048.

對socket進行掃瞄時是依次掃瞄的,即採用輪詢的方法,效率較低。

當套接字比較多的時候,每次select()都要通過遍歷fd_setsize個socket來完成排程,不管哪個socket是活躍的,都遍歷一遍。這會浪費很多cpu時間。

gevent

greenlet已經實現了協程,但是這個還的人工切換,是不是覺得太麻煩了,不要捉急,python還有乙個比greenlet更強大的並且能夠自動切換任務的模組

gevent

其原理是當乙個greenlet遇到io(指的是input output輸入輸出,比如網路、檔案操作等)操作時,比如訪問網路,就自動切換到其他的greenlet,等到io操作完成,再在適當的時候切換回來繼續執行。

由於io操作非常耗時,經常使程式處於等待狀態,有了gevent為我們自動切換協程,就保證總有greenlet在執行,而不是等待io

gecent.sleep()

Select實現併發伺服器

併發伺服器除了可以用多執行緒和多程序實現以外,還可以用select實現單執行緒併發,下面用select實現簡單的示例,伺服器接收客戶端的連線,並將客戶發的訊息返回,如下 伺服器端 main.c include include include include include include inclu...

select伺服器的實現

select函式是來實現多路i o復用輸入 輸出模型。比純粹的阻塞i o模型更具有實用性,因為程式控制程式碼會停在select這裡等待,直到被監視的檔案控制代碼至少有乙個發生了狀態改變。select函式的功能和呼叫順序 使用select函式時可以將多個檔案描述符集中到一起統一監視,專案如下 1 是否...

併發伺服器 select 程式設計

1,併發伺服器,通過多路io復用,能使得乙個程序同時處理多路io,提公升伺服器吞吐量。在linux支援epoll模型之前,都使用select poll模型來實現io多路復用。select在socket程式設計中還是比較重要的,可是對於初學socket的人來說都不太愛用select寫程式,他們只是習慣...