1.Tcp粘包问题
2.udp
区别:不粘包,不可靠,传输效率高,适合数据量小的传输,不要求传输数据的顺序不需要建立链接
使用场景,对速度要求高,但是对数据完整性要求不高,dns,对战类游戏
网络编程:目前 无法并发处理多个客户端
进程:
一个正在运行中的程序称之为进程
进程来自于操作系统
在第三代操作系统中,诞生了多到技术
多道技术是为了提高计算机资源的利用率,第三代以前是穿行执行任务的批量处理方式
空间复用
同一时间段内在内存中储存多个程序的数据
内存区域要相互隔离,物理隔离,你是不可以随意访问的
时间复用
切换+保存
当一个进程遇到IO操作时,就切换其他进程来执行,切换之前要记录当前运行的状态
切换条件:
遇到IO操作
运行时间过长,时间片用完了
什么时候要开启进程
当执行一个任务时,执行时间过长,为了提高效率,我们就可以将这个任务交给子进程去完成
Linux与Windows开启子进程的区别
linux 会把数据完整copy给子进程 ,作为子进程的初始状态
windows 会重新导入父进程的代码来获取需要数据,这样一来创建进程的代码又被执行了一次,造成递归创建进程
所以要将开启子进程的代码放到 if __name__ == "__main__":中 保证创建进程的代码只被父进程执行
如何开启子进程
1.导入 multiprocessing 中的 Process
实例化Process类 用target来指定要执行任务函数
调用start来开启进程
2.创建一个类,继承Process,覆盖run方法,将任务代码放到run中
进程之间内存相互隔离
僵尸进程 有害
子进程结束了,父进程还在运行,子进程会占用pid 并且将保留最后的运行状态在内存中
在linux中 父进程需要调用wait/waitpid来获取子进程的残留信息,并清理它
python中已经封装好了 wait 操作不需要我们自己来清理
如果出现很多僵尸进程
清除僵尸进程的方法就是 杀死父进程
孤儿
父进程已经挂了 ,子进程还在运行,会被移交给操作系统来管理
常用属性:
join 父进程等待子进程运行结束 其实是提高子进程的优先级
is_alive 是否存活
getpid 获取自己的进程id
name 进程的名字
daemon
terminate 终止这个子进程 有延迟
start 启动进程 有延迟
因为开启和关闭进程 都是操作系统来完成
进程的状态
运行 -io> 阻塞 -> 就绪态
运行 -时间片用完了(运行时间过长)> 就绪态
阻塞
当程序遇到了IO操作,就进入了阻塞态
非阻塞
程序正在运行中,没有任何IO操作
指的是程序的运行状态
并行
多个程序同时运行,是真正的同时执行,仅在多核中会出现
并发
多个事件同时发生了,看起来像是都在运行,本质上是切换执行
程序员永恒的话题
提高程序的效率 减少IO 力求尽可能多占用CPU