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...