io 多路復用
就是我們說的select,poll,epoll,有些地方也稱這種io方式為event driven io。select/epoll的好處就在於單個process就可以同時處理多個網路連線的io。它的基本原理就是select,poll,epoll這個function會不斷的輪詢所負責的所有socket,當某個socket有資料到達了,就通知使用者程序。
epoll對檔案描述符的操作有兩種模式:lt(level trigger)和et(edge trigger)。lt模式是預設模式,lt模式與et模式的區別如下:
lt模式:當epoll檢測到描述符事件發生並將此事件通知應用程式,應用程式可以不立即處理該事件。下次呼叫epoll時,會再次響應應用程式並通知此事件。
et模式:當epoll檢測到描述符事件發生並將此事件通知應用程式,應用程式必須立即處理該事件。如果不處理,下次呼叫epoll時,不會再次響應應用程式並通知此事件。
支援http的長連線,即使用了content-length
epoll簡單模型
import socket
import re
import select
defservice_client
(new_socket, request)
:"""為這個客戶端返回資料"""
# 1. 接收瀏覽器傳送過來的請求 ,即http請求
# 2. 返回http格式的資料,給瀏覽器
:"""用來完成整體的控制"""
# 1. 建立套接字
tcp_server_socket = socket.socket(socket.af_inet, socket.sock_stream)
tcp_server_socket.setsockopt(socket.sol_socket, socket.so_reuseaddr,1)
# 2. 繫結
tcp_server_socket.bind((""
,7890))
# 3. 變為監聽套接字
tcp_server_socket.listen(
128)
tcp_server_socket.setblocking(
false
)# 將套接字變為非堵塞
# 建立乙個epoll物件
epl = select.epoll(
)# 將監聽套接字對應的fd註冊到epoll中
epl.register(tcp_server_socket.fileno(
), select.epollin)
fd_event_dict =
dict()
while
true
: fd_event_list = epl.poll(
)# 缺省會堵塞,直到 os監測到資料到來 通過事件通知方式 告訴這個程式,此時才會解堵塞
# [(fd, event), (套接字對應的檔案描述符, 這個檔案描述符到底是什麼事件 例如 可以呼叫recv接收等)]
for fd, event in fd_event_list:
# 等待新客戶端的鏈結
if fd == tcp_server_socket.fileno():
new_socket, client_addr = tcp_server_socket.accept(
) epl.register(new_socket.fileno(
), select.epollin)
fd_event_dict[new_socket.fileno()]
= new_socket
elif event==select.epollin:
# 判斷已經鏈結的客戶端是否有資料傳送過來
recv_data = fd_event_dict[fd]
.recv(
1024
).decode(
"utf-8"
)if recv_data:
service_client(fd_event_dict[fd]
, recv_data)
else
: fd_event_dict[fd]
.close(
) epl.unregister(fd)
del fd_event_dict[fd]
# 關閉監聽套接字
tcp_server_socket.close(
)if __name__ ==
"__main__"
: main(
)
i/o 多路復用的特點:
通過一種機制使乙個程序能同時等待多個檔案描述符,而這些檔案描述符(套接字描述符)其中的任意乙個進入讀就緒狀態,epoll()函式就可以返回。 所以, io多路復用,本質上不會有併發的功能,因為任何時候還是只有乙個程序或執行緒進行工作,它之所以能提高效率是因為select\epoll 把進來的socket放到他們的 『監視』 列表裡面,當任何socket有可讀可寫資料立馬處理,那如果select\epoll 手裡同時檢測著很多socket, 一有動靜馬上返回給程序處理,總比乙個乙個socket過來,阻塞等待,處理高效率。
當然也可以多執行緒/多程序方式,乙個連線過來開乙個程序/執行緒處理,這樣消耗的記憶體和程序切換頁會耗掉更多的系統資源。 所以我們可以結合io多路復用和多程序/多執行緒 來高效能併發,io復用負責提高接受socket的通知效率,收到請求後,交給程序池/執行緒池來處理邏輯。
exit(?)
基於 epoll 實現 web 伺服器
1.簡介 epoll 是 linux 平台下特有的一種 i o 復用模型實現,於 2002 年在 linux kernel 2.5.44 中被引入。在 epoll 之前,unix linux 平台下的 i o 復用模型包含 select 和 poll 兩個系統呼叫。隨著網際網路的發展,網際網路的使用...
基於epoll的web伺服器
我們在大量併發的時候epoll有高的效能,所以我們選擇用他去做乙個bs模型的web伺服器 web伺服器 網路上是epoll併發,在解析http命令是下面的思路 具體的主要看 的思路 去除前面的 int n1 0 char pname name if strlen pname 1 else 通過對字元...
nfs伺服器使用
網路檔案系統 nfs,network file system 是一種將遠端主機上的分割槽 目錄 經網路掛載到本地的一種機制,通過對網路檔案系統的支援,使用者可以再本地系統上像操作本地分割槽一樣對遠端主機的共享分割槽 目錄 進行操作。類似於windows共享目錄 安裝nfs伺服器 使用rpm q nf...