day5 线程和多任务
TCP的三次握手用于建立连接标志位
SYN连接请求
FIN关闭连接
ACK确认序号
seq报文序号
ack确认号
TCP的四次挥手用于断开连接
MSL最大报文生存时间
多任务 同一时间多个程序同时运行
线程 程序的分支,系统调度和分派的最小单位拥有少量必不可少的资源就可以运行
主线程 程序的主干main()
子线程 通过 threading.Tread()创建出来的都是子线程
创建 :子线程名(线程对象) = threading.Thread(target=函数名,args=(参数),kwargs=(键值对参数))
运行 子线程名.start()
主线程和子线程:主线程默认会等待子线程执行完毕后再结束
子线程执行顺序:无序,由系统cpu调度
守护线程:主线程结束后,子线程也立即结束,用法 线程.setDaemon(True)
自定义线程类
继承 threading.Thread
重写 run 方法
如果重写了构造方法,则需要调用父类的init()
super(当前类名,self).init()
多线程-共享全局变量
多线程中可以共享全局变量
获取全局变量值
修改全局变量值
global 全局变量名
修改全局变量值
带来的问题?
多个线程同时修改全局变量,导致资源竞争
day6 多线程 互斥锁
同步和异步
同步
多个任务之间执行的时候,有先后顺序,必须一个执行完毕后,另外一个才能继续执行
异步
多个任务之间执行没有先后顺序,可以同时运行,执行的先后顺序不会有什么影响
解决资源竞争的问题使用同步但会降低执行效率
互斥锁
通过对竞争资源加互斥锁,可以解决资源竞争问题,同时又能兼顾执行效率
用法
创建互斥锁
mutex = threading.Lock()
锁定资源
mutex.acquire()
释放资源
mutex.release()
死锁
在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源
尽可能减少互相等待资源的情况,做到资源使用完毕后,及时释放
多任务版udp聊天器
改进思路
单独开辟子线程,专门用来接收信息
具体步骤
1、撤销功能菜单“接收信息” 选项
2、单独开辟子线程,接收信息
3、设置接收信息为循环接收
UDP广播
广播,
向网络中所有的主机发送信息
广播地址
255.255.255.255
广播发送权限
udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True)
TCP服务端架构
功能
1、实现制定端口监听
2、实现服务器端地址重用,避免”Address already in use” 错误
3、能够支持多个客户端连接
4、能够支持不同的客户端同时收发消息(开启子线程)
5、服务器端主动关闭服务后,子线程随之结束
进程及状态进程概念
进程是资源分配的最小单位,程序隔离的边界。
系统默认启动
主进程
主线程
子线程1
子线程2
…
子进程1
子进程2
…
进程状态
新建
就绪
运行
死亡
阻塞
进程的使用
创建
multiprocessing.Process()
参数
target=进程要执行的分支(函数)
args=传递到函数的参数
kwargs=传递到函数的可变参数
name=设置进程名称
名称multiprocessing.current_process()
进程id
方法一multiprocessing.current_process().pid
方法二os.getpid()
进程父id os.getppid()
参数传递args=
传递元组kwargs=
传递可变参数
共享全局变量 进程间不共享全局变量
主进程守护
p1.daemon = True
p1.terminate()
进程和线程的对比
线程和线程之间可以共享全局变量
进程和进程之间不共享全局变量
创建线程可以共享进程中的资源,但是创建进程会向操作系统索要运行资源
多进程开发某个进程挂了,不会影响其它进程的运行
单进程多线程开发,如果进程挂了,那么线程全部消耗,那么多进程开发比多线程开发稳定性要强,但是多进程开发资源消耗比多线程开发资源消耗要大