1. 线程是cpu调度和分配的基本单元。多线程之间是通过互相争抢时间片来竞争资源的,他的机制是异步的。多线程使用方法:导入模块
import threading
创建对象
t= threading.Thread(target=函数引用,args=(参数1,参数2))
开启线程
t.start()
当多个线程之间共享同一个数据时,容易造成数据的丢失,这时候就需要引入同步的概念,即互斥锁。互斥锁也就是给数据上锁,只有当一个线程执行完成并释放锁之后,下一个线程再次锁定该数据资源,以此类推,保证数据的完整性。
举个好理解的例子,多人上卫生间必须要排队,先进去的人上卫生间会上锁,直到完事开门之后,后面的人才能进去。
使用方法:导入模块threading中的类Lock。
import threading
lock = threading.Lock()
上锁lock.acquire() 此时程序进入阻塞状态
释放lock.release() 此时程序进入运行状态
好处:使用互斥锁能保证一个线程完整执行,并且保证了数据的完整性
坏处:多个线程使用多个锁的情况下,容易造成死锁,因此在实际工作中应该少用锁。如果一定要使用,那么锁的范围应该越小越好。
其实使用多线程并不会提高效率,因为python存在一个全局解释器锁的历史遗留问题,也就是著名的GIL 。python的开发者吉多,在1991年计算机还是单核的时候,写出了GIL,用于解决在单核情况下多个线程充分利用cpu资源,就是cpython解释器会自动给一个线程上锁,等到这个线程执行结束,会将GIL锁转移到另一个线程中,这样能保证一个线程占满整个cpu,提高利用效率。(只有当执行耗时操作时,GIL锁也会自动转移到另一个线程中。)但是没过几年,因特尔公司发明了多核cpu处理器,这样GIL由原来的优势反而变成了缺点。其间也有社区专家优化过此问题,但是最终还是无法完全解决此问题。
所以,要想避免此问题,最好使用进程加协程的方式。或者使用jpython解释器。
网友评论