之前学到gevent 遇到IO操作,自动切换
对于一个network IO (这里我们以read举例),它会涉及到两个系统对象,一个是调用这个IO的process (or thread),另一个就是系统内核(kernel)。当一个read操作发生时,它会经历两个阶段:
1 等待数据准备 (Waiting for the data to be ready)
2 将数据从内核拷贝到进程中 (Copying the data from the kernel to the process)
记住这两点很重要,因为这些IO Model的区别就是在两个阶段上各有不同的情况。
IO模型
阻塞IO
非阻塞IO
IO多路复用(监听多个连接)
异步IO
驱动信号
1 阻塞IO blocking默认...
Python 多线程应用
同步锁
123456789101112131415161718192021222324252627282930import timeimport threadingdef subNum(): global num # print("ok") lock.acquire() # 加锁 temp = num time.sleep(1) num = temp - 1 # 加在公共数据上 lock.release() # 解锁num = 100thread_list = []lock = threading.Lock()for i in range(100): t = threading.Thread(target=subNum) t....
Python 并发编程
1 为什么有操作系统
操作系统: 位于底层和应用软件之间
工作方式: 向下管理硬件 向上提供接口
1.1 操作系统进程切换:
出现IO操作(像time.sleep之类的)
固定时间(是操作系统控制的切换时间)
1.2进程的定义:进程是一个程序在一个数据集谁给你的动态执行过程。程序、数据集(程序过程中使用的资源)、进程控制块(切换的时候 保存状态)
进程并发的时候,如果是一个应用程序,会把资源进行传递
进程是通过进程切换,是共享的资源,保存的的时候保存的是进程的资源集
进程: 资源管理单位(容器)
线程: 最小执行单位
1.3 并行和并发的区别:串行是线程依次执行,运行期间独享内存并行是每个线程占用一个内核并发是有等待
python的多线程: 由于GIL,同一时刻,同一...
Python socket 粘包
1 TCP的三次握手四次挥手
1.1 三次握手
1 客户端向服务端发起SYN请求,请求建立连接,
2 服务端同意建立连接,回应ACK,同时服务端向客户端发起SYN请求
3 客户端回应ACK
1.2 四次挥手挥手是任意的,客户端和服务端都可以首先断开连接
下面是以客户端发起的挥手
1 客户端发送完数据后发起FIN 请求,之后直接断开,
2 服务端返回一个ACK
3此时服务端还没有接收完数据,所以没有断开连接,接收完后,服务端想要断开,发送FIN
4 客户端返回ACK,结束
现实中的是TIME WAIT大量存在于服务端,是服务端主动断开连接,它在等待客户端发送ACK
总结
1 为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
这是因为服务端的LISTEN状...
Python 软件开发规范
Python的软件开发规范主要是文件的目录结构是规范化的
123456789101112131415161718192021222324252627282930├─bin├─conf│ └─__pycache__├─core│ └─__pycache__├─db├─docs├─lib│ └─__pycache__└─log''''bin 存放的是可执行文件conf 配置文件core 存放的是源码文件db 数据库文件docs文档lib 用到的模块,第三方的,自己写的包log 日志文件在根目录下面还应该有README描述项目信息的文件它需要说明以下几个事项:软件定位,软件的基本功能。运行代码的方法: 安装环境、启动命令等。简要的使用说明。代码...