Web伺服器 併發伺服器 Epoll(3 4 5)

2021-09-26 10:19:34 字數 2950 閱讀 9140

epoll是一種解決方案,nginx就是用的這個

中心思想:不要再使用多程序,多執行緒了,使用單程序,單執行緒去實現併發

在上面部落格實現的**中使用過的輪詢去檢視套接字有沒有資料,而epoll是主動通知

當使用多程序的時候,是複製乙份資源去檢視,epoll不用複製,直接來

優勢:1.共享記憶體 2.事件通知

import socket

import select

deftcp_server

(new_tcp_socket, request)

: request_lines = request.splitlines(

)print

(request_lines)

print

(">"*30

)try

:file

=open

("./test/login.html"

,"rb"

)except

:# 構造響應頭

# 使用content-length實現長連線

response_header +=

"content-length:%d\r\n"

%len

(response_body)

response_header +=

"\r\n"

response = response_header.encode(

"utf-8"

)+ response_body

# 傳送響應資料

new_tcp_socket.send(response)

defmain()

:"""對大致流程進行控制"""

# 1.建立tcp套接字

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

# 設定當伺服器先close()即伺服器4次揮手之後資源立即釋放

tcp_socket.setsockopt(socket.sol_socket, socket.so_reuseaddr,1)

# 2.繫結埠

tcp_socket.bind((""

,7890))

# 3.監聽套接字

tcp_socket.listen(

128)

tcp_socket.setblocking(

false

)# 建立乙個epoll物件

epoll = select.epoll(

)# 將監聽套接字對應的fd註冊到epoll中,並繫結事件 fd:檔案描述符

epoll.register(tcp_socket.fileno(

), select.epollin)

# 定義儲存socket的字典

fd_event_dict =

dict()

while

true

:# 預設堵塞,直到os檢測到資料到來通過事件通知方式告訴程式,才會解堵塞 返回list

fd_event_list = epoll.poll(

)# [(fd,event)] (套接字對應的檔案描述符,這個檔案描述符對應的到底是什麼事件,例如可以呼叫recv接收等)

# 遍歷元組

for fd, event in fd_event_list:

if fd == tcp_socket.fileno():

new_tcp_socket, client_addr = tcp_socket.accept(

) epoll.register(new_tcp_socket.fileno(

), select.epollin)

# 通過字典儲存socket,鍵為fd,值為socket

fd_event_dict[new_tcp_socket.fileno()]

= new_tcp_socket

elif event == select.epollin:

# 判斷已經鏈結的客戶端是否有資料傳送過來

recv_data = fd_event_dict[fd]

.recv(

1024

).decode(

"utf-8"

)if recv_data:

# 有資料操作

# 4.為這個客戶端服務

tcp_server(fd_event_dict[fd]

, recv_data)

else

:# 無資料操作

fd_event_dict[fd]

.close(

) epoll.unregister(fd)

del fd_event_dict[fd]

# 關閉監聽套接字

tcp_socket.close(

)if __name__ ==

'__main__'

: main(

)

個人部落格**

個人github位址

web伺服器 併發web伺服器實現 epoll

在linux的網路程式設計中,很長的時間都在使用select來做事件觸發。在linux新的核心中,有了一種替換它的機制,就是epoll。epoll 是當今 linux 系統採用的方式,一般伺服器都是用 epoll 來實現的。epoll 是一種方案,這種方案不使用多程序多執行緒多協程,而是使用單程序單...

Web伺服器 併發伺服器 長連線(3 4 4)

每次new socket都被強制關閉,造成短連線 所提不要關閉套接字 但是不關閉的話,瀏覽器不知道發完沒有啊 此時用到header的屬性content length 將http body的長度裝到返回頭,送出給瀏覽器 當瀏覽器獲取完資料了之後,就不會再載入了 設定非堵塞 tcp sever sock...

Web伺服器 併發伺服器 長連線(3 4 4)

目錄 每次new socket都被強制關閉,造成短連線 所提不要關閉套接字 但是不關閉的話,瀏覽器不知道發完沒有啊 此時用到header的屬性content length 將http body的長度裝到返回頭,送出給瀏覽器 當瀏覽器獲取完資料了之後,就不會再載入了 設定非堵塞 tcp sever s...