线程:其实就是代码的一个执行分支,cpu调度的是线程去执行代码 获取当前线程对象,判断代码是哪个线程执行的
print(threading.current_thread())
获取活动线程的数量
print(threading.active_count())
查看程序活动线程列表
thread_list = threading.enumerate()
注意点: 1、线程再去执行的时候是无序的,默认由cpu调度决定 2、主线程会等待全部子线程把任务执行完成程序再退出
线程执行任务参数:
- target:执行目标函数名
- kwargs:以字典的方式给函数传参
- args:以元组的方式给函数传参
- name:设置线程名字
- group:线程组
守护主线程:线程名.setdaemon(True)
多线程共享全局变量
- 多个线程同时操作全局变量会有可能产生资源竞争导致数据错误的情况
- 解决方法:让一个线程执行完成以后再让另外一个线程再执行,保证同时只有一个线程取操作全局变量
- 线程同步:join
- 同步:一个任务执行完成以后另外一个任务再去执行,需要等待前面的任务执行完才能执行
优点:很方便在多个线程间共享数据
缺点:线程是对全局变量随意遂改可能造成多线程之间对全局变量的混乱(即非线程安全)
互斥锁-简单的同步机制
加上互斥锁,哪个线程先执行无法决定是由cpu调度决定,如果顺序比较重要可以加join(),不关心顺序只关心结果可以使用互斥锁
注意点:加上锁同一时刻有一个线程去执行,也就是说多任务瞬间成为单任务,性能会下降
- 互斥锁的作用:保证多个线程安全访问竞争资源
- 使用锁的优点:确保了某段关键代码只能由一个线程从头到尾完整的执行
- 使用锁的缺点:阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率就大大的下降了,由于可以存在多个锁,不同的线程持有不同的锁,并试图获取对方持有的锁时,可能会造成死锁
死锁-相互等待对方释放的锁
创建互斥锁
lock = threading.Lock()
上锁
lock.acquire()
解锁
lock.release()
注意如果下标索引越界也要释放锁,不要影响后面的线程去取值