欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python线程之如何解决共享变量问题

程序员文章站 2024-03-31 22:44:52
前面提到了这个场景,展示了一个比较耗时的转账操作。这篇继续转帐,下面展示一段程序,多个线程的操作都更改了amount变量导致运行结果不对的问题。前文说了转账问题下面展示另一种转账的方式:这里启动了4个...

前面提到了这个场景,展示了一个比较耗时的转账操作。

这篇继续转帐,下面展示一段程序,多个线程的操作都更改了amount变量导致运行结果不对的问题。

前文说了转账问题

下面展示另一种转账的方式:

这里启动了4个线程,每个线程内有个lambda表达式,分别于学委的账户进行转账,但是最后结果是185. 而不是157.

下面是运行结果:

Python线程之如何解决共享变量问题

ps: 这只是一种运行结果。多线程的运行结果不是永远一样的。

如何解决这个问题?

观测结果我们发先amount只保留了最后一个值。

好,下面改造一下:

学委这里加了一个event函数,把转账计划打印出来。

从下面的一次运行结果看,event函数的输出结果没错,所有”计划转账“金额都如预期[-7, 20, -20 7]。 问题是transfer函数再多线程执行的时候,我们发现amount被多线程竞争修改了:

用户0转账金额变成20
用户1转账金额变成-20
用户2转账金额变成7
用户3转账金额变成7

Python线程之如何解决共享变量问题

也就是说,amount被后面的线程修改了,但是前面线程还没有执行完。
用户0应该转账-7的,中间还没有执行完毕,结果被线程1修改了amount为20,用户0继续执行转账,余额变成177. 其他依次推理。

amount这个变量被多个线程竞争修改了,这个就是程序的共享变量。

到底如何解决?

方法非常简单:直接干掉共享变量。

下面就是消除共享变量的方法: 让共享变成每个线程访问独立运行空间

所以代码改动如下:

运行结果如下:

Python线程之如何解决共享变量问题

上面的代码不管怎么运行,运行多少次最后学委的账户都是157.

这次展示的另一种方式来避开多线程出现bug的方法,使用一个list下标跟线程名字一一对应,这样只要是对应名字的线程拿到的数值不错错乱。

到此这篇关于python线程之如何解决共享变量问题的文章就介绍到这了,更多相关python线程解决共享变量问题内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!