For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
随着互联网的不断发展,Python编程等开发语言也成为目前大多数软件开发程序员都在学习的一种编程开发语言,而本文我们就通过案例分析来简单了解一下,Python编程全局解释器锁的用法与优化。
GIL(GlobalInterpreterLock),全局解释器锁,是CPython为了避免在多线程环境下造成Python解释器内部数据的不一致而引入的一把锁,让Python中的多个线程交替运行,避免竞争。
1、为什么需要GIL
GIL本质上是一把锁,学过操作系统的同学都知道锁的引入是为了避免并发访问造成数据的不一致。CPython中有很多定义在函数外面的全局变量,比如内存管理中的usable_arenas和usedpools,如果多个线程同时申请内存就可能同时修改这些变量,造成数据错乱。另外Python的垃圾回收机制是基于引用计数的,所有对象都有一个ob_refcnt字段表示当前有多少变量会引用当前对象,变量赋值、参数传递等操作都会增加引用计数,退出作用域或函数返回会减少引用计数。同样地,如果有多个线程同时修改同一个对象的引用计数,就有可能使ob_refcnt与真实值不同,可能会造成内存泄漏,不会被使用的对象得不到回收,更严重可能会回收还在被引用的对象,造成Python解释器崩溃。
2、GIL优化
受GIL约束的代码不能并行执行,降低了整体性能,为了尽量降低性能损失,Python在进行IO操作或不涉及对象访问的密集CPU计算的时候,会主动释放GIL,减小了GIL的粒度,比如
读写文件
网络访问
加密数据/压缩数据
所以严格来说,在单进程的情况下,多个Python线程时可能同时执行的,比如一个线程在正常运行,另一个线程在压缩数据。
3、用户数据的一致性不能依赖GIL
GIL是为了维护Python解释器内部变量的一致性而产生的锁,用户数据的一致性不由GIL负责。虽然GIL在一定程度上也保证了用户数据的一致性,比如Python3.10.4中不涉及跳转和函数调用的指令都会在GIL的约束下原子性的执行,但是数据在业务逻辑上的一致性需要用户自己加锁来保证。
GIL是CPython为了在多线程环境下为了维护解释器内部数据一致性而引入的,为了尽可能降低GIL的粒度,在IO操作和不涉及对象访问的CPU计算时会主动释放GIL。后,用户数据的一致性不能依赖GIL,可能需要用户使用Lock或RLock()来保证数据的原子性访问。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。