多线程
多线程
1. 线程是最小的资源调度单位,在程序运行时默认只有一个线程,叫做主线程;同一个进程中的线程之间能够共享资源,适用于io密集型
2. 多线程的执行是无序的,由操作系统决定
3. 多线程并发操作,节省时间
4. 自定制多线程类 一般重写run方法,其中为业务逻辑
5. .start()开启子线程 .run() 只是单纯的运行主线程中的函数
6. 线程对于同一个资源的访问, 如果没有控制得当,就会对于同一资源的数据进行破坏,而且线程的运行结果不可
预料,这种现象叫做‘线程不安全’
解决线程不安全问题:线程同步概念 (协同步调,按照预定的先后顺序,进行执行---按顺序工作)
---> 互斥锁 对于上锁的资源,每次只能有一个线程能够访问,
第二个线程需等待上一个线程结束访问,才能访问
1、操作系统调用work1的时候,work1获取到num=0,此刻会将num上锁,不允许其他的线程操作num
2、work1 对于num加1之后,进行重新的赋值
3、操作完毕之后,对于Num解锁,num的值已经解锁,其他的线程可以操作num。
4、work2进行操作的时候,Num的值已经是修改之后的num的值了,是1,work2在对Num进行修改的时候,work2也要对于Num进行上锁
5、同理,对于数据进行修改的过程中,一定要对Num 进行加锁,操作完成之后,一定要解锁,这个时候,就保证了数据的正确性
7. 线程的状态: 创建 --启动--> 就绪 <--调度--> 运行 --> 死亡
↑满足条件 ↓等待条件
<--等待状态(阻塞)<--
threading
threading.Thread(target=func, args=(,)) 创建新线程
threading.current_thread() 获取当前线程
threading.enumerate() 枚举所有线程,返回线程列表
threading.active_count() 查看活跃的线程个数