您的位置:首页 > 其它

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

2018-01-10 22:15 246 查看
协程,又称微线程。一句话说明什么是线程:协程是一种用户态的轻量级线程。 

高并发+高扩展性+低成本:一个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_dat
ad2c
a = 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()

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: