web服務 3 epoll高效率實現併發伺服器

2022-03-10 13:52:34 字數 3638 閱讀 6507

知識點:

之前寫的四種方法實現併發服務效率都還是低,早期的伺服器採用的是select和poll方式,select這種方式的特點是輪詢所有套接字去乙個個看有沒有事件發生,但是裝套接字的列表長度是有限制的,而且輪詢方式效率低,poll方式只是解決了裝套接字這個列表的長度限制,但也是採用輪詢的方式。目前實際場景中,linux伺服器採用的都是epoll方案實現併發服務的,它解決了輪詢這種低效率方式,採用事件通知的方式告訴應用程式哪個套接字發來了資料它的效率遠遠高於其他四種,它也是採用單程序單執行緒的方式,但是是堵塞的,主要有倆大特點:1、epoll方式會對映乙個和作業系統一樣的能處理應用程式的指定的檔案描述符記憶體空間(即省去了將應用程式中的套接字檔案描述符拷貝到作業系統中的過程),它既不屬於應用程式也不屬於作業系統 ,是倆個共用的的2、客戶端套接字傳送資料,epoll採用事件通知方式告訴應用程式,而不需要輪詢所有的套接字列表

1、**實現:

#

!/usr/bin/env python

#coding=utf-8

#author:劉仲

#datetime:2018/8/6 9:24

#software: pycharm

import

socket

import

select

import

re"""

之前寫的四種方法實現併發服務效率都還是低,早期的伺服器採用的是select和poll方式,select這種方式的特點是輪詢所有套接字去

乙個個看有沒有事件發生,但是裝套接字的列表是有限制的,而且輪詢方式效率低,poll方式只是解決了裝套接字這個列表的長度限制,

但也是採用輪詢的方式。目前實際場景中,linux伺服器採用的都是epoll方案實現併發服務的,它解決了輪詢這種低效率方式,採用事件

通知的方式告訴應用程式哪個套接字發來了資料它的效率遠遠高於其他四種,它也是採用單程序單執行緒的方式,但是是堵塞的,主要有倆

大特點:1、epoll方式會對映乙個和核心一樣的能處理應用程式的事件的2、客戶端套接字傳送資料,核心的檔案系統會採用事件通知的

方式告訴應用程式

"""def

webserver():

web_socket =socket.socket(socket.af_inet, socket.sock_stream)

web_socket.bind((

'127.0.0.1

', 7786))

web_socket.listen(128)

epl = select.epoll() #

建立epoll物件

epl.register(web_socket.fileno(), select.epollin | select.epollet) #

將監聽套接字註冊到epl

fd_dict = dict() #

存放新的套接字的檔案描述符和與之對應的套接字物件

while

true:

epl_list = epl.poll() #

預設堵塞,獲取註冊到epl物件中的所有套接字列表,列表裡存的是元祖,元祖倆個值分別對應的是

#套接字的檔案描述符和事件型別

for fd, event in epl_list: #

獲取套接字的檔案描述符和事件型別

if fd == web_socket.fileno(): #

剛開始epl_list肯定存放的是監聽套接字,所以新的客戶端鏈結進來,先判斷檔案描述符是否等與監聽套接字的檔案描述符

new_socket, new_adress = web_socket.accept() #

新客戶端鏈結進來進行解堵塞

fd_dict[new_socket.fileno()] = new_socket #

將新的客戶端套接字的檔案描述符和與之對應的套接字存放到字典中

epl.register(new_socket.fileno(), select.epollin) #

將新的套接字註冊到epl中

elif event == select.epollin: #

當監聽事件觸發,即客戶端發來資料

try:

data = fd_dict[fd].recv(1024).decode('

utf-8')

except

:

print('

客戶端沒有傳送資料')

#關閉新的套接字

epl.unregister(fd) #

從epl中移除該檔案描述符的鏈結

del fd_dict[fd] #

刪除這個套接字的鍵值對

web_socket.close()

if__name__ == '

__main__':

webserver()

CPS系統特性介紹 3 低成本 高效率

cps校園通訊平台主體及核心使用.net sql server進行開發,因為各個層簡潔且相互分離的特性,所以可以在同一物理伺服器上部署多個層以節約成本,也可以在多個伺服器上分別部署相應的層以提高執行效率。對於不同的客戶我們會根據客戶的實際需求和經濟能力提供不同的伺服器部署方案。例如,有些學校只想使用...

3個提高效率的Linux shell命令使用技巧

1 當執行乙個命令,發現許可權不夠時,不需要重新輸入該命令 輸入sudo 就會自動用sudo許可權執行上個命令,然後驗證輸入密碼 2 行刪除 ctrl k 當你需要全部刪除游標右邊的內容時 ctrl y crtl k和ctrl u刪除內容的復原,相當於windows的剪下 ctrl u 當你需要全部...

刀片伺服器架構 高效率vs 廠商鎖定,怎麼權衡?

刀片伺服器可將多台伺服器放在同一機箱中,這通常用於企業資料中心中,因為它可幫助有效利用可用的樓層空間。但是,由於機箱的配置特定於每個 商,這裡存在刀片伺服器廠商鎖定的風險。從本質上講,刀片伺服器架構特定於 商。你無法將戴爾伺服器裝入思科機箱,並且沒有 商提供適合不同 商機箱的通用刀片伺服器模組。因此...