python线程同步方式,简述线程同步机制
本文主要是给大家分享Python线程同步机制的实际应用场景。银行转账栗子供你参考,希望对你有帮助。
00-1010I。银行转帐的例子2。问题解决III。这次让我们来看看一个真实场景吧:银行转账汇总表
目录
假设有一个100瓦的韦雪账户。
然后转移中有多个任务,转入转出都和这个韦雪账户有关。
且这些任务发生是随机的。
我们先把上面的场景写成代码:
韦雪帐户=100
#金额为负数,即转出金额。
def转账(货币):
全球韦雪_账户
韦雪账户=钱
下面是传输事件的多线程模拟。我们假设四个事件同时发生。
随机导入
导入线程
导入日期时间
导入时间
韦雪帐户=100
#金额为负数,即转出金额。
def转账(货币):
全球韦雪_账户
韦雪账户=钱
#创建4个任务,转移到学术委员会的帐户。
对于范围(10000):内的I
穿线。thread(target=lambda : transfer(-1))。开始()
穿线。thread(target=lambda : transfer(1))。开始()
穿线。thread(target=lambda : transfer(-1))。开始()
穿线。thread(target=lambda : transfer(1))。开始()
#等待活动线程只留下主线程主线程
时间.睡眠(10)
打印(- * 16)
Print(活动线程数3360 ,threading.active _ count())
Print(活动线程3360 ,threading.current _ thread()。姓名)
打印(学术委员会帐户余额:,韦雪_帐户)
这里启动了4个线程,循环了1万次,也就是4万个线程,转到了学术委员会的账户上。
下面是运行结果:
跑了几次,学术委员会的账还是没错,余额还是100W。
上面有上万个代码线程,但每次操作都很简单,完成一个加法。
线程一个接一个开始,很快切换到下一个线程。我们看到程序没有问题。
下面的转换,这一次不要只是40000个线程,让我们使转移任务需要更多的时间,每启动一个线程进行模拟10万次转帐户。
随机导入
导入线程
导入日期时间
导入时间
韦雪帐户=100
#金额为负数,即转出金额。
def转账(货币):
全球韦雪_账户
对于范围(100000):内的x
韦雪账户=钱
创建4个任务给重复学委账户转账:
对于范围(10):内的I
穿线。thread(target=lambda : transfer(-1))。开始()
穿线。thread(target=lambda : transfer(1))。开始()
穿线。thread(target=lambda : transfer(-1))。开始()
穿线。thread(target=lambda : transfer(1))。开始()
时间.睡眠(10)
打印(- * 16)
Print(活动线程数3360 ,threading.active _ count())
打印(实时
跃线程:", threading.current_thread().name)
print("学委账户余额:", xuewei_account)
这里运行的结果就比较出乎意料了:
多线程编程复杂的地方就在这里了, 有时候明明平平无奇的代码,改造成多线程,就很容易出bug!
当然上面的代码并不是平平无奇,相比第一段代码,上面的转账函数做的事件更多,更耗时。
二、问题解决
我们加上锁。
代码如下:
import randomimport threading
import datetime
import time
xuewei_account = 100
lock = threading.Lock()
# amount为负数即是转出金额
def transfer(money):
lock.acquire()
global xuewei_account
for x in range(100000):
xuewei_account += money
lock.release()
# 创建4个任务给重复学委账户转账
for i in range(10):
threading.Thread(target=lambda: transfer(-1)).start()
threading.Thread(target=lambda: transfer(1)).start()
threading.Thread(target=lambda: transfer(-1)).start()
threading.Thread(target=lambda: transfer(1)).start()
time.sleep(10)
print("-" * 16)
print("活跃线程数:", threading.active_count())
print("活跃线程:", threading.current_thread().name)
print("学委账户余额:", xuewei_account)
运行结果如下:
上面的代码不管怎么运行,运行多少次最后学委的账户都是100.(PS:学委不会联系读者转账的,这个特别注意)。
不管多少个线程,每次转账函数内部转账的代码(从global到 += money这一段代码)只会被一个线程调用。
三、总结
展示了同步机制解决一些编程问题的思路。读者可以多多借鉴,思考锁的应用。
为什么在对amount重度操作(本文第二段代码)的时候,计算就出错了!
这里amount
相当于多线程都在操作的变量,也就是共享变量,多线程编程要特别注意这类变量,避免出现对共享变量的操作,有些程序在并发规模很小的时候一点问题也没有。
并发编程是高度利用CPU计算能力的编程方式,并发程序也就是在并行执行同类任务的程序。这个可以跟单线程应用比较。
到此这篇关于Python线程之同步机制实际应用场景举例说明的文章就介绍到这了,更多相关Python线程同步机制内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。