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