python基础编程:python多线程共享变量的使用和效率方法
程序员文章站
2022-05-02 20:07:22
...
今天小编就为大家分享一篇python多线程共享变量的使用和效率方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
python多线程可以使任务得到并发执行,但是有时候在执行多次任务的时候,变量出现“意外”。
import threading,time
n=0
start=time.time()
def b1(num):
global n
n=n+num
n=n-num
def b2(num):
for i in range(1000000):
b1(num)
t1=threading.Thread(target=b2,args=(5,))
t2=threading.Thread(target=b2,args=(8,))
t1.start()
t2.start()
t1.join()
t2.join()
end=time.time()
print(n)
print(end-start)
执行结果:
18
0.7520430088043213
可见变量n从0变成了18,用时是0.75s,原因是计算机系统计算类似n=n+num是分两步计算的,先计算n+num的值放进内存中,然后再把计算的值赋值给n,正是这个间隙导致了变量出现“意外”。
这时候可以使用threading.Lock来把线程中的变量锁定,使用完再释放!
import threading,time
n=0
lock=threading.Lock()
start=time.time()
def b1(num):
global n
n=n+num
n=n-num
def b2(num):
for i in range(1000000):
lock.acquire()#等待获取或获取修改变量的权限,并霸占它们
b1(num)
lock.release()#释放霸占的变量
t1=threading.Thread(target=b2,args=(5,))
t2=threading.Thread(target=b2,args=(8,))
t1.start()
t2.start()
t1.join()
t2.join()
end=time.time()
print(n)
print(end-start)
执行结果:
0
3.335190773010254
虽然变量的值正确了,但慢了很多倍,效率大大的打折扣,多线程的优势也没凸显出来。
所以尽量使用局部变量来代替全局变量在线程中使用,这样可以避免效率的问题。
其实这里不仅有技术,更有那些技术之外的东西,比如,如何做一个精致的程序员,而不是“屌丝”,
程序员本身就是高贵的一种存在啊,难道不是吗?
内容就以上怎么多,最后给大家推荐一个口碑不错的
公众号【程序员学府】,这里有很多的老前辈学习技巧,学习心得,面试技巧,职场经历等分享,更为
大家精心准备了零基础入门资料,实战项目资料,每天都有程序员定时讲解Python技术,分享一些学习
的方法和需要留意的小细节,非常欢迎你的加入,未来的日子,编码之外,有你有我,一起做一个人不
傻,钱很多,活得久的快乐的程序员吧!
推荐阅读
-
Python多线程编程(三):threading.Thread类的重要函数和方法
-
python cx_Oracle的基础使用方法(连接和增删改查)
-
python嵌套函数使用外部函数变量的方法(Python2和Python3)
-
python基础教程之简单入门说明(变量和控制语言使用方法)
-
Python编程使用*解包和itertools.product()求笛卡尔积的方法
-
Python编程基础(类和对象的使用)
-
python基础教程之简单入门说明(变量和控制语言使用方法)
-
python cx_Oracle的基础使用方法(连接和增删改查)
-
python嵌套函数使用外部函数变量的方法(Python2和Python3)
-
Python多线程编程(三):threading.Thread类的重要函数和方法