自己动手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()
高并发+高扩展性+低成本:一个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()
相关文章推荐
- 自己动手web服务器06--面向对象(II)
- 自己动手开发一个 Web 服务器(一)
- 自己动手实现一个WEB服务器
- 自己动手写Web容器之TomJetty之二:开启服务器
- 自己动手架设linux下Web服务器(图)1
- 自己动手模拟开发一个简单的Web服务器
- [置顶] 自己动手安装turbogears -- 搭建基本Python web开发服务器环境
- 自己动手写web服务器一(浏览器的访问信息) - 任天胜的个人空间 - 开源中国社区
- 自己动手模拟开发一个简单的Web服务器
- 自己动手写Web容器之TomJetty之二:开启服务器
- 自己动手架设linux下Web服务器(图)2
- 自己动手,写个Web服务器(Java版)——第三篇
- 自己动手架设linux下Web服务器(图)3
- 学习笔记之自己动手写WEB服务器
- 自己动手打造WEB服务器 Windows + Apache + PHP + MySQL
- 自己动手架设linux下Web服务器(图)4
- 自己动手写web服务器(上),深入底层了解ASP.NET浏览器与服务器通信原理
- 自己动手写web服务器(上),深入底层了解ASP.NET浏览器与服务器通信原理
- 自己动手写web服务器二(处理get请求)
- 自己动手写web服务器一(浏览器的访问信息)