| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Python知识库 -> Python的线程05 解决共享变量问题举例 -> 正文阅读 |
|
[Python知识库]Python的线程05 解决共享变量问题举例 |
前面学委分享了几篇多线程的文章,前面提到了银行转账这个场景,展示了一个比较耗时的转账操作。 这篇继续转帐,下面展示一段程序,多个线程的操作都更改了amount变量导致运行结果不对的问题。 前文说了转账问题下面展示另一种转账的方式:
这里启动了4个线程,每个线程内有个lambda表达式,分别于学委的账户进行转账,但是最后结果是185. 而不是157. 下面是运行结果: PS: 这只是一种运行结果。多线程的运行结果不是永远一样的。 如何解决这个问题?根据观测结果我们发先amount只保留了最后一个值。 好,下面改造一下:
学委这里加了一个event函数,把转账计划打印出来。 从下面的一次运行结果看,event函数的输出结果没错,所有”计划转账“金额都如预期[-7, 20, -20 7]。 问题是transfer函数再多线程执行的时候,我们发现amount被多线程竞争修改了:
也就是说,amount被后面的线程修改了,但是前面线程还没有执行完。 amount这个变量被多个线程竞争修改了,这个就是程序的共享变量。 到底如何解决?方法非常简单:直接干掉共享变量。 下面就是消除共享变量的方法: 让共享变成每个线程访问独立运行空间 所以代码改动如下:
运行结果如下: 上面的代码不管怎么运行,运行多少次最后学委的账户都是157.(PS:学委不会联系读者转账的,这个特别注意)。 这次展示的另一种方式来避开多线程出现bug的方法,使用一个list下标跟线程名字一一对应,这样只要是对应名字的线程拿到的数值不错错乱。 对了,喜欢Python的朋友,请关注学委的 Python基础专栏 or Python入门到精通大专栏
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/16 4:32:19- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |