美文网首页
多任务-线程

多任务-线程

作者: 咏远瑞智 | 来源:发表于2018-06-05 21:25 被阅读0次

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

    相关文章

      网友评论

          本文标题:多任务-线程

          本文链接:https://www.haomeiwen.com/subject/janmsftx.html