自己动手web服务器06-协程

协程,又称微线程。一句话说明什么是线程:协程是一种用户态的轻量级线程。 

高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题,所以很适合用于高并发处理

进程资源分配的单位

2线程操作系统调度的单位

3进程切换需要的资源很最大,效率很低

4线程切换需要的资源一般,效率一般

5协程切换任务资源很小,效率高

6多进程、多线程根据cpu核数不一样可能是并行的 也可能是并发的。

协程的本质就是使用当前进程在不同的函数代码中切换执行,可以理解为并行。

协程是一个用户层面的概念不同协程的模型实现可能是单线程 也可能是多线程


import socket
import re
import gevent
class HTTPServer(object):
    def __init__(self): #初始化操作
        """创建服务器相关的资源"""
        
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        server_socket.bind(("", 8888))
        server_socket.listen(128)
        self.server_socket = server_socket  #变成属性
    
def request_handler(self,client_socket):#实例方法
        #变成实例方法
        # 客户端接受请求
        
recv_data = client_socket.recv(4096)
        if not recv_data:
            print("客户端断开链接")
            client_socket.close()
            return
        
recv_str_data = recv_data.decode()
        ret = re.match(r"[^/]+([^ ])+", recv_str_data)
        path_info = ret.group(1)
        print(path_info)
        if path_info == "/":
            path_info = "/index.html"
        try
:
            with open("./static" + path_info, "rb") as file:
                file_data = file.read()
        except Exception as e:
            reponce_line = "HTTP/1.1 404 Not\r\n"
            
reponce_hearder = "Server:PythonServer1.0"
            
reponce_body = "ERROR"
            
reponce_data = reponce_line + reponce_hearder + "\r\n" + reponce_body
            client_socket.send(reponce_data.encode())
        else:
            reponce_line = "HTTP1.1 200 OK\r\n"
            
reponce_hearder = "Server:PythonServer1.0\r\n"
            
reponce_body = file_data
            reponce_data = (reponce_line + reponce_hearder + "\r\n").encode() + reponce_body
            client_socket.send(reponce_data)
        finally:
            client_socket.close()
    def start(self):
            while True:
                client_socket, client_address = self.server_socket.accept()
                print("接收到%s链接请求" % str(client_address))
                # 创建并且执行
                
g1= gevent.spawn(self.request_handler, client_socket)
                # 协程
                
g1.join()
if __name__ == '__main__':
    # 创建一个web服务器实例
    
httpserver = HTTPServer()
    # 启动web服务器运行
    
httpserver.start()

 


你可能感兴趣的:(Python)