这里写自定义目录标题
python多线程的锁用法
https://blog.csdn.net/hellenlee22/article/details/93640487
锁机制
在了解锁机制前,我们先来看一下下面这个例子:
## 使用多线程进行加法运算
import threading
# 定义全局变量VALUE
VALUE = 0
# 定义加法线程函数
def add_value():
global VALUE
for x in range(1000000):
VALUE += 1
print('value = ', VALUE)
# 定义两个线程并发执行加法操作
def add_thread_main():
for x in range(2):
t = threading.Thread(target=add_value)
t.start()
if __name__ == '__main__':
add_thread_main()
"""
Output:
value = 1147074
value = 1211397
"""
上面的示例按照我们的逻辑看来应该是依次输出1000000和2000000,但结果并不是这样的,这就是常说的多线程共享全局变量问题。其实在我们执行线程时,执行的顺序是不一定的,也就是说有时候可能重合在一起执行,因而导致有时虽二者都对共享变量进行了一次加法(即本应加两次)而实际上只真正加了一次。
而为了解决这样的问题,threading模块提供了一个Lock类,这个类可以在某个线程访问某个变量的时候加锁,其他线程此时不能访问该变量,直到加锁线程处理完控制变量并把锁释放了,其他线程才能进行访问处理。锁机制使用起来也很简单,由于是多个线程访问共享变量,因而需设置一个全局的Lock类对象,然后在访问前后分别使用Lock类的acquire()方法加锁和release()方法释放锁。
上述例子使用锁机制仅需做以下几处的修改:
## 使用多线程进行加法运算
import threading
# 定义全局变量VALUE
VALUE = 0
gLock = threading.Lock()
# 定义加法线程函数
def add_value():
global VALUE
gLock.acquire()
for x in range(100000):
VALUE += 1
print('value = ', VALUE)
gLock.release()
# 定义两个线程并发执行加法操作
def add_thread_main():
for x in range(4):
t = threading.Thread(target=add_value)
t.start()
if __name__ == '__main__':
add_thread_main()
“””
output:
value = 100000
value = 200000
value = 300000
value = 400000
"""