python global 多线程共享变量与线程锁的使用例子
但随之而来的问题是,当一个线程正在对变量a进行计算时,其它线程此时也改变了a的值,这就会导致第一个线程的计算结果发生错误。为了避免这种情况,可以使用线程锁。线程锁的意义是同一个时刻,只能有一个线程获得这把锁,然后对数据进行操作,其他的线程只能等待。该代码的意思是启动了两个线程,在第一个线程中,改变了两次全局变量a的值,在第二个线程中看看能否知道a的值被改变了。根据运行结果可知,当一个线程改变了全局
·
目录
1.多线程共享变量例子:
该代码的意思是启动了两个线程,在第一个线程中,改变了两次全局变量a的值,在第二个线程中看看能否知道a的值被改变了。
from threading import Thread
import time
a = 0
def func():
global a
a = 10
print("线程1:",a)
time.sleep(5)
a = 11
def func2():
print("线程2:", a)
time.sleep(6)
print("线程2:", a)
t1 = Thread(target=func)
t2 = Thread(target=func2)
t1.start()
t2.start()
运行结果:
根据运行结果可知,当一个线程改变了全局变量的值,其它线程读取这个变量也会是改变后的值。
但随之而来的问题是,当一个线程正在对变量a进行计算时,其它线程此时也改变了a的值,这就会导致第一个线程的计算结果发生错误。为了避免这种情况,可以使用线程锁。
线程锁的意义是同一个时刻,只能有一个线程获得这把锁,然后对数据进行操作,其他的线程只能等待。这样,就可以避免多个线程同时修改一份数据。
2.线程锁例子
我们通过两段代码来了解线程锁的意义
下面代码加了线程锁:
from threading import Thread,Lock
import time
m_lock = Lock()
a = 0
def func():
global a
m_lock.acquire() # 加锁
for i in range(1000000):
a = a + 1
print("线程1:", a) # 释放锁
m_lock.release()
def func2():
global a
m_lock.acquire()
a = a + 8
m_lock.release()
print("线程2:", a)
t1 = Thread(target=func)
t2 = Thread(target=func2)
t1.start()
t2.start()
运行结果:
如果不加锁:
from threading import Thread,Lock
import time
m_lock = Lock()
a = 0
def func():
global a
for i in range(1000000):
a = a + 1
print("线程1:", a) # 释放锁
def func2():
global a
a = a + 8
print("线程2:", a)
t1 = Thread(target=func)
t2 = Thread(target=func2)
t1.start()
t2.start()
运行结果:
通过对比两段代码的运行结果可知,加线程锁是十分有必要的。
更多推荐
已为社区贡献11条内容
所有评论(0)