做Python';队列get/put方法在阻塞时是否持有该队列的锁?

做Python';队列get/put方法在阻塞时是否持有该队列的锁?,python,multithreading,queue,Python,Multithreading,Queue,我有一个传统的多线程生产者/消费者模式,中间有一个。队列的这种实现是线程安全的。消费者可以通过两种方式使用数据: 阻塞 while self.running: data = self.receiver_q.get(block=True) # do something with data 非阻塞 while self.running: try: data = self.receiver_q.get(block=False) except queue

我有一个传统的多线程生产者/消费者模式,中间有一个。队列的这种实现是线程安全的。消费者可以通过两种方式使用数据:

阻塞

while self.running:
    data = self.receiver_q.get(block=True)
    # do something with data
非阻塞

while self.running:
    try:
        data = self.receiver_q.get(block=False)
    except queue.Empty:
        continue
    # do something with data
在阻塞方法中,使用者等待队列中有数据。在此期间,消费者是否持有队列上的锁?我无法想象它在允许队列上放置新数据的同时,如何保持锁

另外,这两种模式之间是否存在性能差异?

(1)不,使用者没有持有锁;它只是被阻塞,直到请求得到满足,但队列仍然可用。如果有多个消费者,那么这个消费者就在潜在接收者的池中;解析函数将选择满足的顺序

(2) 任何性能差异都取决于实现。不要问我们——你面前有最重要的权威:你的电脑。使用您选择的测试场景和
timeit
工具