Python3并发编程篇之网络IO模型

前言

除非特别指定,几乎所有的IO接口 ( 包括socket接口 ) 都是阻塞型的。
这给网络编程带来了一个很大的问题,如在调用recv(1024)的同时,线程将被阻塞,
在此期间,线程将无法执行任何运算或响应任何的网络请求。

好文

https://www.cnblogs.com/cainingning/p/9556642.html

简单的解决方案

方案

在服务器端使用多线程(或多进程)。
多线程(或多进程)的目的是让每个连接都拥有独立的线程(或进程),这样任何一个连接的阻塞都不会影响其他的连接。

存在的问题

开启多进程或都线程的方式,在遇到要同时响应成百上千路的连接请求,则无论多线程还是多进程都会严重占据系统资源,降低系统对外界响应效率,而且线程与进程本身也更容易进入假死状态。

改进方案

方案

大多数可能会考虑使用“线程池”或“连接池”。
“线程池”旨在减少创建和销毁线程的频率,其维持一定合理数量的线程,并让空闲的线程重新承担新的执行任务。
“连接池”维持连接的缓存池,尽量重用已有的连接、减少创建和关闭连接的频率。
这两种技术都可以很好的降低系统开销,都被广泛应用很多大型系统,如websphere、tomcat和各种数据库等。

存在的问题

“线程池”和“连接池”技术也只是在一定程度上缓解了频繁调用IO接口带来的资源占用。
而且,所谓“池”始终有其上限,当请求大大超过上限时,“池”构成的系统对外界的响应并不比没有池的时候效果好多少。所以使用“池”必须考虑其面临的响应规模,并根据响应规模调整“池”的大小。

总结

对应上例中的所面临的可能同时出现的上千甚至上万次的客户端请求,
“线程池”或“连接池”或许可以缓解部分压力,但是不能解决所有问题。
总之,多线程模型可以方便高效的解决小规模的服务请求,但面对大规模的服务请求,多线程模型也会遇到瓶颈,可以用非阻塞接口来尝试解决这个问题。


网络IO模型的分类

针对于网络IO模型中recv / recvform / accept等操作,会经历两个阶段:

  1. 等待数据阶段,waitdata阶段
  2. 拷贝数据到进程阶段,copydata阶段

阻塞IO模型

https://blog.csdn.net/qq_32617703/article/details/103427968

非阻塞IO模型

https://blog.csdn.net/qq_32617703/article/details/103428097

IO多路复用模型

信号驱动IO模型

...

异步IO模型

推荐阅读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值