欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-02 20:21:39
...

共享变量问题

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

解决互斥 - 方法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课程自己整理的笔记哒,转载请注明出处哈~