如何与多个兼容所有者一起锁定 Python 中的资源

How to lock a resource in Python with multiple compatible owners

我有一个带有共享资源的多线程应用程序。有两种类型的线程,AB 访问此共享资源。只要没有其他 class 的线程也在访问资源,任何数量的相同类型的线程都可以同时访问资源而不会出现竞争条件。

目前,我有一个保护共享资源的普通锁,以避免当不兼容的线程函数同时访问资源时可能出现的竞争条件。但是,大多数线程都是 A 类型,并且共享资源涉及网络请求,因此不允许这些线程同时 运行 会对性能造成很大影响。

Python中是否有一个优先级锁数据结构允许同一个"type"的多个所有者,这样如果有很多线程A和一个线程B 尝试获取锁,在线程 B 获取锁之前,不再有线程 A 获取锁,一旦获取,所有线程 A会等到它释放锁吗?

我认为一个可能的方法是有一个额外的“主”线程负责交替允许 A 或 B 线程。 我认为它可以用信号量来完成。 应该有两个信号量 AsemBsem。 主线程最初释放 Asem n 次,允许 n 个线程访问共享数据。休眠一段时间,然后获取Asemn次。之后没有线程访问共享数据所以 获得 BSem m 次,睡眠,获得,并重复整个过程。 反过来,A 和 B 线程应获取各自的信号量以访问共享数据。

import threading
from time import sleep 

Asem = threading.Semaphore()
Bsem = threading.Semaphore()

def master():
    while True:
        Asem.release()
        Asem.release()
        Asem.release()

        sleep(0.1)

        Asem.acquire()
        Asem.acquire()
        Asem.acquire()

        Bsem.release()
        Bsem.release()
        Bsem.release()

        sleep(0.1)

        Bsem.acquire()
        Bsem.acquire()
        Bsem.acquire()