python多线程的锁用法

锁机制
在了解锁机制前,我们先来看一下下面这个例子:

## 使用多线程进行加法运算
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
"""

转自:
https://www.cnblogs.com/Unikfox/p/9703885.html

你可能感兴趣的:(python)