【问题标题】:When will `threading.RLock.acquire()` return None?`threading.RLock.acquire()` 什么时候返回 None?
【发布时间】:2020-02-26 01:43:53
【问题描述】:

在 Python 文档 here 中,它指出

如果有多个线程被阻塞等待锁被解锁,那么一次只有一个线程能够获取锁的所有权。 这种情况下没有返回值。

但在哪种情况

我在 IPython 中试验了以下代码:

import time, threading

def func(rlock):
    print(rlock.acquire())
    for i in range(4):
        print(i)
        time.sleep(1)
    rlock.release()
    print('done')

rlock = threading.RLock()


# 2 threads
threading.Thread(target=func, args=[rl]).start()
threading.Thread(target=func, args=[rl]).start()

rlock 释放后一个线程开始运行,然后另一个线程:

rlock.release()

输出

True
0
1
2
3
done
True
0
1
2
3
done

在两个线程中rlock.acquire() 得到了返回值True

寻找rlock.acqure() 没有返回值(返回无)的示例?

【问题讨论】:

  • 嗨 Frozen Flame,我知道这是一个有点老的问题,但您能否检查我的回答并检查它是否符合您的问题,或者您还有任何疑问? :)

标签: python multithreading locking python-multithreading


【解决方案1】:

这里的问题是一个误解。文档说:

如果有多个线程被阻塞等待锁被解锁,那么一次只有一个线程能够获取锁的所有权。在这种情况下,没有返回值

no return value 与返回 None 不同。它实际上什么都不返回,甚至None,因为函数被阻塞直到获得锁

文档的意思是,这些情况没有不同的返回值,而是阻塞行为。这也是该段没有指定任何返回值而是解释阻塞过程的原因(因为该段没有参数,默认情况下将应用blocking=True)。

因此,总结如下:

  • 对于blocking=True

    • adquire() -> 如果锁可用 -> 返回 True
    • adquire() -> 如果锁不可用 -> 阻塞直到可用,然后返回 True
  • 对于blocking=False

    • adquire() -> 如果锁可用 -> 返回 True
    • adquire() -> 如果锁不可用 -> 返回 False

考虑到这一切,您的问题when will RLock.acquire() return None? 的答案将是it doesn't ;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 2014-11-04
    • 1970-01-01
    • 2021-10-11
    • 2016-09-05
    • 2015-03-15
    相关资源
    最近更新 更多