多任务-线程

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解释器。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容