当前位置 :首页 >> 电影

因为Python指令集自带的bug,老板差点把我开了

2023-04-27   来源 : 电影

作者:小K

相关联:麦叔Smalltalk

❝ 上期的Python三分钟留言区,有很多年以希望了解Python的GIL是个啥玩意。 但是希望了解GIL究竟是个啥,我们能够学习一些借助于的知识。 这样才能更好得了解GIL。 ❞ 什么是驱动程序公共安全

驱动程序公共安全, 是指给定或方式(这些给定或方式是多驱动程序构建的) 可以在多驱动程序的环境污染下被公共安全有效的访问。

毕竟直观了?我举个例子:

假如今天当日12:00,在某该平台有1元抢茅台商业活动,参加有商业活动的茅台就一瓶。

但是当日集结了好几万软件在线等放抢信号,时间到了12:00:00,这些软件疯狂点选鼠标涨价。

此时某该平台称许要应有只有一个人能赢得商业活动茅台,要不然该平台还不赔死。「这就是驱动程序公共安全的概念。」

Python中的驱动程序非公共安全

import threadingzero = 0def change_zero(): global zero for i in range(3000000): zero += 1 zero -= 1th1 = threading.Thread(target = change_zero)th2 = threading.Thread(target = change_zero)th1.start()th2.start()th1.join()th2.join()print(zero)

我定义了一个算子change_zero对全局给定zero+1、-1操作方式。

还定义了两个驱动程序th1和th2去分派它3000000*2次。

每次+1、-1都会被分派的话,输出的zero称许还是0,

但是编码分派之前...

好像根本不会还等于0。

所以我们推断,运转当中称许有几次+1,-1的操作方式从未有效地被分派。(驱动程序非公共安全)。

但是这样的编码投入生产称许是有bug的,如果将这编码用在一些额度账面上,那写编码的人称许是头铁了。

❝ 那有什么办法能挺身而出驱动程序非公共安全的操作方式呢? ❞

有个很常用的方式,那就是「加有栓」。

规避驱动程序非公共安全操作方式

import threadinglock = threading.Lock() # 创建驱动程序栓zero = 0def change_zero(): global zero for i in range(3000000): with lock: # 把驱动程序非公共安全操作方式加有栓 zero += 1 zero -= 1th1 = threading.Thread(target = change_zero)th2 = threading.Thread(target = change_zero)th1.start()th2.start()th1.join()th2.join()print(zero)

从上方编码中,我们把zero += 1和zero -= 1这两步操作方式展放加有栓。

❝ 类似接力跑步,只有便是一棒队友主导权接过接力棒,才能往下一棒队友那边跑步,从未完成接力棒过渡性则不能跑步。 ❞ ❝ 上下文控件with lock在操作方式展放会分派lock.acquire()摘下栓,分派再行即会将栓释放给下一个操作方式lock.release()。 ❞

运转上方加有了栓之前的编码:

给与的结果都是0,没法再出现计算混乱状态的状况,这就从驱动程序非公共安全转变成驱动程序公共安全操作方式了。

后记

看见这,你有否有异议了?

Python不是有GIL护体吗?怎么还会出现这种驱动程序非公共安全的状况?

北京妇科医院预约挂号
深圳妇科专科医院哪里好
定西哪个医院看白癜风好
郑州白癜风治疗方法有什么
成都哪家医院做人流比较好
刘邦送给范增玉斗暗藏杀机,范增挥剑砍碎,堪称是最好的处理事件办法

在之前国现代中国文化之前,玉石始终都是美好的代名词,自始说是“君子如玉”。上曾深入研究声称,玉石在简而言之的其发展过程之前也有重要关键作用,因为它代表礼制,所以各有不同的玉石也有各有不同的涵义。比如,...

友情链接