二十二、 深入Python的进程和线程(上篇)( 二 )


线程间变量的共享在多线程中 , 所有变量对于所有线程都是共享的 , 因此 , 线程之间共享数据的最大危险在于多个线程同时修改一个变量 , 那就乱套了 , 所以我们需要互斥锁 , 来锁住数据 。
二十二、 深入Python的进程和线程(上篇)文章插图
代码如上图所示 , 上面代码中打印的a是1还是2?
答案是:2 。 因为出现了global关键字 , 线程间变量的共享 , 在func函数中的a是全局变量 。 因此在函数中a的值发生了变化 。
【二十二、 深入Python的进程和线程(上篇)】下面 , 我们提高一点点难度 , 代码如下图所示 , 还是猜一猜a是啥东西 。 注意:这里出现了join来阻塞 , 并且增加了加和减的操作 。
二十二、 深入Python的进程和线程(上篇)文章插图
相信很多人都认为是0 , 其实这个a的值是变化的 , 可能这次是0, 下次是1 , 还有可能是1000000 , 比如 , 我可以
a就是在[-1000000 , 1000000]中的一个随机数 。
为什么呢?这是因为虽然他们是同时运行的 , 但是同时在修改我们的a , 那就乱了 。 a在for i in range(1000000) , 就是遍历了1000000 , incr和decr的方法都加上一起了 , 在这1000000次遍历中 , 不知道有多少加 , 多少减 , 比如 , 我1000000都是加 , 没有减 , a就是1000000 , 但是这种情况的概率很低 。
如果你就是想出现0 , 其实只需要加一个互斥锁就可以了 。 这样你加多少次 , 我就减多少次 , 加减的次数不会叠加 。 因此来了lock的用法 , 具体代码如下图所示 。
二十二、 深入Python的进程和线程(上篇)文章插图
这个a怎么运行都是 0 。 因为我们把这个a锁上了 , 这样就加1000000次 , 减1000000次 , 怎么出来都是我们的0 。
今天也学到了很多东西呢 , 明天有什么新知识呢?真期待鸭~如果喜欢文章可以关注我哦~
?
本文已收录 GitHub , 传送门~[1], 里面更有大厂面试完整考点 , 欢迎 Star 。
?
Reference[1]
传送门~: