當前位置:
首頁 >
Python实现HTTP服务器(三)线程、进程、协程实现多任务
發布時間:2025/3/15
25
豆豆
生活随笔
收集整理的這篇文章主要介紹了
Python实现HTTP服务器(三)线程、进程、协程实现多任务
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.線程、進程實現多任務HTTP服務器
import re import socket import multiprocessing import threadingdef service_client(new_socket):"""為這個客戶端返回數據"""# 接收瀏覽器發送過來的請求,即HTTP請求request=new_socket.recv(1024)request=request.decode("utf-8") # 解碼request_lines=request.splitlines() # 按照行('\r', '\r\n', \n')分隔,返回一個包含各行作為元素的列表print(request_lines)# GET /index.html HTTP/1.1# [^/]表示除了/都可以file_name=""ret=re.match(r"[^/]+(/[^ ]*)",request_lines[0])if ret:file_name=ret.group(1)if file_name=="/":file_name="/index.html"# 2.返回HTTP格式的數據,給瀏覽器try:# 準備發送的body,打開HTML文件f=open("html"+file_name,'rb')except:response="HTTP/1.1 404 NOT FOUND\r\n"response+='\r\n'response+="----file not found----"new_socket.send(response.encode("utf-8"))else:html_content=f.read()f.close()# 準備發送的headerresponse="HTTP/1.1 200 OK\r\n"response+="\r\n" # header與body之間必須隔一行# 發送headernew_socket.send(response.encode("utf-8"))# 發送HTMLnew_socket.send(html_content)new_socket.close()def main():tcp_sever_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)# 服務器先關閉,保證重新開啟不占用端口tcp_sever_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)tcp_sever_socket.bind(("",7890))tcp_sever_socket.listen(128)while True:# 等待新客戶端的鏈接new_socket,client_addr=tcp_sever_socket.accept()#p=multiprocessing.Process(target=service_client,args=(new_socket,))p=threading.Thread(target=service_client,args=(new_socket,))p.start()# 子進程關閉一次主進程還需關閉一次,Linux下文件硬鏈接的原因,兩個名字指向同一個文件,因此要關閉兩次#new_socket.close()# 關閉監聽套接字tcp_sever_socket.close() if __name__ == '__main__':main()2.gevent協程實現多任務HTTP服務器
import re import socket import gevent from gevent import monkeymonkey.patch_all() def service_client(new_socket):"""為這個客戶端返回數據"""# 接收瀏覽器發送過來的請求,即HTTP請求request=new_socket.recv(1024)request=request.decode("utf-8") # 解碼request_lines=request.splitlines() # 按照行('\r', '\r\n', \n')分隔,返回一個包含各行作為元素的列表print(request_lines)# GET /index.html HTTP/1.1# [^/]表示除了/都可以file_name=""ret=re.match(r"[^/]+(/[^ ]*)",request_lines[0])if ret:file_name=ret.group(1)if file_name=="/":file_name="/index.html"# 2.返回HTTP格式的數據,給瀏覽器try:# 準備發送的body,打開HTML文件f=open("html"+file_name,'rb')except:response="HTTP/1.1 404 NOT FOUND\r\n"response+='\r\n'response+="----file not found----"new_socket.send(response.encode("utf-8"))else:html_content=f.read()f.close()# 準備發送的headerresponse="HTTP/1.1 200 OK\r\n"response+="\r\n" # header與body之間必須隔一行# 發送headernew_socket.send(response.encode("utf-8"))# 發送HTMLnew_socket.send(html_content)new_socket.close()def main():tcp_sever_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)# 服務器先關閉,保證重新開啟不占用端口tcp_sever_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)tcp_sever_socket.bind(("",7890))tcp_sever_socket.listen(128)while True:# 等待新客戶端的鏈接new_socket,client_addr=tcp_sever_socket.accept()gevent.spawn(service_client,new_socket)# 關閉監聽套接字tcp_sever_socket.close() if __name__ == '__main__':main()總結
以上是生活随笔為你收集整理的Python实现HTTP服务器(三)线程、进程、协程实现多任务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为交换机屏蔽远程计算机,华为交换机远程
- 下一篇: java的位置_Java中数据存放的位置