凡科建站怎么用,岳阳网页,网站开发小图标大全,有哪些网站可以做pptGIL锁的产生#xff1a; 为了保证在单线程情况下#xff0c;Python的正常执行和效率#xff0c;GIL锁产生了#xff0c;由于只有一把锁就不会产生死锁也不用切换。 对于Python语言而言#xff0c;只有CPython解释器#xff08;用C语言编写的Python解释库#xff09;存在…GIL锁的产生 为了保证在单线程情况下Python的正常执行和效率GIL锁产生了由于只有一把锁就不会产生死锁也不用切换。 对于Python语言而言只有CPython解释器用C语言编写的Python解释库存在GIL。 GIL的影响开启多线程情况下 在I/O密集型多线程任务中GIL锁的影响很小因为等待IO的过程中锁是可以共享的 但在CPU计算密集型任务中单线程和多线程的运行速度几乎一模一样。 有GIL了是够还有必要添加线程锁 有必要 先说线程锁的作用 线程锁作用1保证多个线程共享同一资源时不会出现异常。 假设现在有n个Python解释器由于GIL的存在每一个Python解释器同一时刻有且只能有一个线程执行。但由于有n个解释器同一时刻就有n个线程可以同时执行。加入这n个线程访问同一资源就有可能出现异常。 解决给每一个线程都添加一个线程锁就能保证他们不能同时访问相同的资源。线程锁的作用是确保同一个时刻只有一个线程能够获得锁其他线程必须等待。不同于GIL锁作用于解释器级别线程锁是作用在操作系统级别的权限高于GIL锁。
线程锁的作用2可以保证线程操作的原子性。 原子性对于一个事件的所有操作要么一次性都做完要么就不做不能做一半留一半。 GIL确实限制了同一时刻只能有一个Python字节码执行。当这种限制是解释器级别的。只是保证了同一个解析器同一时刻只有一个线程执行Python字节码并不能保证多个线 线程操作的原子性。 比如我需要烧一壶水线程1我需要用烧的水沏茶线程2我必须等线程1执行完才能执行线程2. 假如不加线程锁会出现的情况我拿烧到一半还没开的水去沏茶了。