web server單程序 非阻塞 長連線寫法

2021-09-01 11:26:39 字數 2546 閱讀 7211

本次的建立的web-server比上一次的發表有許多改進之處,首先是在進行多程序,多執行緒,協程的方案中我們選擇了協程,但不同於一般的協程得是,我們是使用的非阻塞來完成多工。此外對於長連線本次也用到了,可以讓瀏覽器一次請求多個元素。

#這個地方加入了content-length的header資訊,告訴瀏覽器每次傳輸完成的會有多少個位元組。

#這裡是曾經的老式寫法

# new_socket.close() 長連線的精髓在於不用立刻關閉連線重複使用

def main():

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

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

tcp_socket.bind(("",7788))

tcp_socket.listen(128)

#設定socket非阻塞,因此下面對於accept當沒有返回值會報錯,需要對它進行異常捕獲

tcp_socket.setblocking(false)

client_socket_list =

while true:

try:

#這個地方就是乙個阻塞點

new_socket,client_addr = tcp_socket.accept()

except exception as ret:

pass

else:

new_socket.setblocking(false)

for client_socket in client_socket_list:

try:

#這裡是另乙個阻塞點

recv_data = client_socket.recv(1024).decode("utf-8")

except exception as ret:

pass

else:

#因為當有返回值時,存在返回空和返回資料的情況,於是需要下面的分開討論。

if recv_data:

service_client(client_socket,recv_data)

else:

client_socket.close()

client_socket_list.remove(client_socket)

tcp_socket.close()

if __name__ == "__main__":

main()

單程序 單執行緒 非阻塞 長鏈結

單程序 單執行緒 非阻塞實現併發 import socket import time defmain tcp server socket socket.socket socket.af inet,socket.sock stream 新建乙個伺服器socket tcp server socket.s...

程序與執行緒 阻塞與非阻塞

程序 cpu執行任務的模組。執行緒 模組中的最小單元。cpu比作我們每個人,到飯點吃飯了。可以點很多菜 cpu中的程序 宮保雞丁,魚香肉絲,酸辣土豆絲。每樣菜具體包含了哪些內容 cpu每個程序中的執行緒 宮保雞丁 詳情 黃瓜 胡蘿蔔 雞肉 花生公尺 而詳情構成了宮保雞丁這道菜,吃了以後不餓。就可以幹...

程序 執行緒 同步非同步 阻塞非阻塞

2015 08 19 15 23 38 週三 執行緒執行緒安全 如果你的 所在的程序中有多個執行緒在同時執行,而這些執行緒可能會同時執行這段 執行緒安全問題都是由全域性變數及靜態變數引起的 若每個執行緒中對全域性變數 靜態變數只有讀操作,而無寫操作,一般來說,這個全域性變數是執行緒安全的 若有多個執...