Table of Contents
都要在什么时候使用什么方式
1.循环服务器模型:udp更加适用
2.IO并发模型:io操作文件,网络时候(select,poll,epoll)
3.多进程/多线程并发:客户端连接较少,逻辑处理复杂
整理一下,poll和epoll等使用,优缺点
lambda还可以没参数 lambda:time.time()
Socket.REUSEPORT
SO_REUSEPORT支持多个进程或者线程绑定到同一端口,提高服务器程序的性能,解决的问题:
- 允许多个套接字 bind()/listen() 同一个TCP/UDP端口
- 每一个线程拥有自己的服务器套接字
- 在服务器套接字上没有了锁的竞争
- 内核层面实现负载均衡
- 安全层面,监听同一个端口的套接字只能位于同一个用户下面
python中True等于1
在python中bool是int的子类在python3中,true不能随便赋值,2是可以随便赋值的
python中is和==
is是判定对象id是否相等==是判定值是否相等issubclass,判断一个类是否是一个类的子类isinstance,判断一个对象是否是一个类的实例文件读写会有异常,网络连接等操作会有异常,文件创建等也有异常 需要捕获
IO并发
IO分类:阻塞IO,非阻塞IO,IO多路复用,异步IO等
阻塞IO:
某些条件没达成(等输入,等对方回应),长时间处理内容(网络,大文件)
非阻塞IO
大多数阻塞IO都可以变非阻塞,(针对某些条件没达成的阻塞做timeout)简单来说就是阻塞时候去做点别的事套接字非阻塞设置setblocking() False是非阻塞 BlockingIOErrorsettimeout() 设置超时检测 join Event timeout两个异常捕获要用元组 except(Exception,timeout)
IO多路复用
系统内核感知,先执行那个IO操作
具体方案:
都在包select中
select:windows linux unixpoll:linux uniuxepoll :linux 效率最高,版本最新
select模块中的操作
rlist,wlist,xlist三个列表,代表:读,写,异常,要监控的类别要放在这三个列表中写操作是不阻塞,立即执行,执行完毕要从列表移除要循环读取select的返回值,建立三个for遍历rlist,wlist,xlist读是要被动等待,比如accept,比如写操作就是可以立即执行,比如write,read异常是发生异常时候返回,
IO事件:通过一个对象调用一个方法这个方法可以阻塞,这就是一个事件
无法确定什么时候发生,就是读事件
二进制属性
& 按位与 14 & 19 = 00010 = 2 一0则0| 按位或 14 | 19 = 11111 = 31 一1则1^ 按位异或 14 ^ 19 = 11101 = 29 相同为0不同为1<< 左移 14 << 2 = 111000 = 56 向左移动低位补0>> 右移 14 >> 2 = 11 = 3 向右移动去掉低位
二进制可以代表属性111111,都为真+
select和poll都只支持1024个触发
poll
建立查找地图,根据一项,找另一项
pollhup断开事件,也会发送给pollin,这两个容易死循环
epoll
水平触发:一直等接收
边缘触发:只等一次,消息累加
协程技术
非抢占式;程序员可以决定函数的执行
单台计算机 2000是高并发,1万需要一些技术