python多线程共享全局变量,python 多进程共享变量
本文主要介绍Python线程如何解决共享变量的问题。出门的时候学了银行转账的场景。本文解决了多线程最后一次操作改变了amount变量,导致运行结果不正确的问题。有需要的朋友可以参考一下。
前面提到了银行转账的场景,展示了一个耗时的转账操作。
本文继续转账,下面展示一个程序。多线程的运行改变了数量变量,导致运行结果不正确。
我前面提到过转学问题。
下面展示另一种转账的方式:
随机导入
导入线程
导入日期时间
导入时间
韦雪={balance: 157}
#金额为负数,即转出金额。
def转账(货币):
name=threading.current_thread()。getName()
打印( %s将%s%(姓名,钱)转到韦雪)
韦雪=钱
打印(韦雪帐户余额:,韦雪[余额])
Lists=[-7,20,-20,7] #四转金额,负数从学术委员会账户转出,正数从其他转出。
#创建4个任务,将上述列表的金额转移到学术委员会。
线程=[]
对于范围(4):中的I
金额=列表[i]
name=t- str(i)
打印((%s计划转移%s%(名称,金额))
mythread=线程。线程(name=name,target=lambda : transfer(amount))
threads.append(mythread)
#开始转账
对于线程:中的测试
启动()
#等待3秒钟以上所有转账任务完成,我们正在查看帐户余额。
时间.睡眠(3)
打印(- * 16)
打印(学术委员会帐户余额:,韦雪[余额])
这里启动了四个线程,每个线程都有一个lambda表达式,这个表达式被转到了学术委员会的账户上,但是最后的结果是185。而不是157。
下面是运行结果:
PS: 只是手术的一个结果。多线程的运行结果并不总是相同的。
如何解决这个问题?
观察的结果是,我们只保留了第一笔金额的最后一个值。
好,下面改造一下:
随机导入
导入线程
导入日期时间
导入时间
韦雪={balance: 157}
Lists=[-7,20,-20,7] #四转金额,负数从学术委员会账户转出,正数从其他转出。
延期转账(金额):
name=threading.current_thread()。getName()
打印((%s将%s%(名称,金额)转移到韦雪)
韦雪[余额]=金额
打印(韦雪帐户余额:,韦雪[余额])
#创建4个任务,将上述列表的金额转移到学术委员会。
对于范围(4):中的I
金额=列表[i]
name=str(i)
# mythread=线程。线程(name=name,target=lambda : transfer(amount))
定义事件():
打印((%s计划转移%s%(名称,金额))
转账(金额)
mythread=线程。线程(名称=名称,目标=事件)
mythread.start()
#等待3秒钟以上所有转账任务完成,我们正在查看帐户余额。
时间.睡眠(3)
打印(- * 16)
打印(学术委员会帐户余额:,韦雪[余额])
学术委员会在这里增加了一项活动。
e>函数,把转账计划打印出来。
从下面的一次运行结果看,event函数的输出结果没错,所有计划转账金额都如预期[-7, 20, -20 7]。 问题是transfer函数再多线程执行的时候,我们发现amount被多线程竞争修改了:
用户0转账金额变成20
用户1转账金额变成-20
用户2转账金额变成7
用户3转账金额变成7
也就是说,amount
被后面的线程修改了,但是前面线程还没有执行完。
用户0应该转账-7的,中间还没有执行完毕,结果被线程1修改了amount为20,用户0继续执行转账,余额变成177. 其他依次推理。
amount
这个变量被多个线程竞争修改了,这个就是程序的共享变量。
到底如何解决?
方法非常简单:直接干掉共享变量。
下面就是消除共享变量的方法: 让共享变成每个线程访问独立运行空间
所以代码改动如下:
import randomimport threading
import datetime
import time
xuewei = {balance: 157}
lists = [-7, 20, -20, 7] # 4次转账的数额,负数为学委的账户转出,正数为他人转入。
# 我们不要依赖amount变量了
def transfer():
name = threading.current_thread().getName()
xuewei[balance] += lists[int(name)] #通过线程名字来获取对应金额
print("xuewei账户余额:", xuewei[balance])
# 创建4个任务给学委转账上面lists的金额
threads = []
for i in range(4):
amount = lists[i]
name = str(i)
print("%s 计划转账 %s" % (name, amount))
# mythread = threading.Thread(name=name, target=lambda: transfer())
def event():
transfer()
mythread = threading.Thread(name=name, target=event)
threads.append(mythread)
# 开始转账
for t in threads:
t.start()
# 等待3秒让上面的转账任务都完成,我们在看看账户余额
time.sleep(3)
print("-" * 16)
print("学委账户余额:", xuewei[balance])
运行结果如下:
上面的代码不管怎么运行,运行多少次最后学委的账户都是157.
这次展示的另一种方式来避开多线程出现bug的方法,使用一个list下标跟线程名字一一对应,这样只要是对应名字的线程拿到的数值不错错乱。
到此这篇关于Python线程之如何解决共享变量问题的文章就介绍到这了,更多相关Python线程解决共享变量问题内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。