1、网络编程:
socket----recv send方法
socketserver---多线程下的socket
接收大数据--方式:先发送长度,接收端接收该长度
防止粘包---方式1,发送接收交替进行 方式2,最后一次接收可变长度
2、多线程
threading---启动多线程方法,join
守护线程--setDemo(True)主线程结束,启动的守护线程跟着结束
GIL锁---同一时刻只有一个线程获得CPU计算资源。1、获取时间片2、获得GIL锁 在单核处理器上第2个条件永远满足
互斥锁--同一时刻只有一个线程修改共享变量
递归锁--声明同一个锁进嵌套的三个门,这个锁就要用递归锁
信号量--同一时刻运行n个线程修改共享变量 n=1,2,3,4...
多线程的协调--event,set标志位,clear标志位,wait标志位,isset方法。 如果标志位isset就前进,否则停下wait标志位
3、生成者消费者队列
生产者可以有多个线程,消费者可以多个线程。消费者者不停处理队列中的数据,生产者不停往队列里放数据
4、多进程
multiprocessing--父进程ID:os.getppid() 本进程ID:os.getpid() 进程占资源不能无限启动,有进程池:只能同时运行n个进程。
进程间数据传递:Queue、Pipe 进程间数据共享:Manager
5、协程
gevent---是对greenlet的封装,greenlet有switch方法,遇到IO手动切换,gevent是对其的封装,可以自动检测到IO自动切换
gevent有joinall方法,标记IO操作:monkey.patch_all()
6、协程的实现
数据的内核态,用户态。拿recv方法来说,send完成后recv的数据就准备好了,调用recv方法就将数据从内核内存空间拷贝到用户内存空间。
阻塞IO(没数据接收就阻塞) 非阻塞IO(没数据接收抛异常) 同步IO(阻塞IO,非阻塞IO,IO多路复用/事件驱动型IO 都是同步IO) 异步IO(完全不阻塞理论上的)
协程的实现方式:IO多路复用。 遇到一个IO就注册一个事件,监测这些事件,执行完成的就返回
IO多路复用三种实现方式:select、poll、epoll
epoll和gevent一样, 在Linux底层都是libevent.so实现的