Python Web服务器(非堵塞,长连接,短连接、epoll)
- 单进程,单线程怎么做到跳过堵塞?
可以用 xxx.setblocking(False) # 来设置套接字为非堵塞的方式
这样在 xxx.accept() 的时候如果没有数据传入就会产生异常 (可以用try的方式来解决) - 短连接就是用三次 ‘握手挥手’ 获得三次数据
如果是处理一些比较小的数据,就用短连接,客户一连接,就给他数据然后断开连接,腾出资源 - 长连接就是用一次 ‘握手挥手’ 获得三次数据
如果处理的是长时间的数据,就用长连接,但会监听客户端的数据,如果在一段时间没有收到客户端的数据,就会断开连接,腾出资源给其他人 - 访问一个网站,一个网站基本上都有许多图片
- 如果是短连接,它会先连接,获得网站数据,然后为在数据中得到的每个图片发起一次连接,显示返回的图片数据
# 这样会创建多个套接字,然后会创建多个进程、线程、协程来处理套接字 - 如果是长连接,它会先连接,获得网站数据,但不断开,继续访问每个图片的数据,显示返回的图片数据
# 但是之前写的程序都会让客户端调用close 本质上还是短连接 - 短连接传完了就调用close 但是长连接不调用,客户端必须让服务器知道你接受完毕才会重新接受客户端的数据
因此服务器在给客户端传数据的时候,数据头中有 content-Length: xx 来表示发送了多少的数据。
- 如果是短连接,它会先连接,获得网站数据,然后为在数据中得到的每个图片发起一次连接,显示返回的图片数据
- epoll(两个特点)
- * 内存映射* 一台电脑有应用程序和操作系统两个的各自使用空间,两者是绝对分开的。每次执行都要把信息从应用程序空间拷贝到操作系统空间去执行,但使用单线程非堵塞的话,会创建一个列表,而操作系统是每个程序都执行一点的雨露均沾型,所以如果一个列表太大,而拷贝信息也要时间,那么运行速度会变慢。
而epoll会创建一个空间,是应用程序和操作系统共用的空间,这样就不要拷贝就能直接得到信息了。(感觉跟Queue队列差不多) - 使用的是时间通知(当可以接收的数据到来时,通知可以接收数据的对线来接收)而不是轮询(每个询问一遍:有没有数据要接收)
- * 内存映射* 一台电脑有应用程序和操作系统两个的各自使用空间,两者是绝对分开的。每次执行都要把信息从应用程序空间拷贝到操作系统空间去执行,但使用单线程非堵塞的话,会创建一个列表,而操作系统是每个程序都执行一点的雨露均沾型,所以如果一个列表太大,而拷贝信息也要时间,那么运行速度会变慢。