【13】Python3 - 多线程共享变量问题(加锁、解锁、可重入锁)

共享变量问题

  • 当一个进程的多个线程需要访问同一个变量的时候,就产生了共享变量的问题。可以通过加锁或者信号灯的方式,解决此问题。

解决互斥 - 方法1:加锁

  • 锁LOCK:
    • 通常对互斥资源进行加锁,在加锁之后,可以对互斥资源进行排他性的使用。在使用完此互斥资源后,要进行解锁。使其他线程可以对该互斥资源进行下一步操作。
    • 锁lock 其实是一个标志,表示该互斥资源正在被使用。
    • 加锁相当于一个令牌,只有拥有令牌的人,才可以对互斥资源进行访问。
# 要想使用锁,首先需要有锁,即创建一个锁的实例
lock = threading.Lock()

# 加锁到合适位置
lock.acquire()


# 在使用完互斥资源之后,进行解锁
lock.release()

解决互斥 - 方法2:semaphore-信号

  • 通过设置信号,允许一个资源最多有几个线程同时使用。
# 参数定义最多有几个线程可以同时使用资源
semaphore = threading.Semaphore(3)


# 申请semaphore
semaphore.acquire()

# 释放semaphore
semaphore.release()

可重入锁

  • 可重入锁主要解决递归调用的时候,需要申请锁的情况。
  • 一个锁可以被一个线程多次申请。
  • 定义锁的时候用的是RLock,即是可重入锁。
t= threading.RLock()   # 定义锁的时候用的是RLock,即定义了一个可重入锁。

注:本文是本人根据北京图灵学院的python课程自己整理的笔记哒,转载请注明出处哈~

你可能感兴趣的:(python学习)