2020.3.26

发布于 2020-03-26  36 次阅读


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是非阻塞  BlockingIOError
settimeout() 设置超时检测 join Event  timeout
两个异常捕获要用元组 except(Exception,timeout)

IO多路复用

系统内核感知,先执行那个IO操作

具体方案:

都在包select中
select:windows linux unix 
poll:linux uniux 
epoll :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万需要一些技术