python - 如何知道 Python multiprocessing.Lock 是否被释放?

标签 python multithreading multiprocessing

>>> l = Lock()
>>> l.acquire()
True
>>> l.release()
>>> l.release()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: semaphore or lock released too many times

抛出 ValueError 异常。如何防止多次释放锁?像 l.is_released() 这样的东西?

最佳答案

问题有点不清楚。您要么需要使用信号量而不是锁,要么检查锁是否被锁定。

例如,Python 的锁与 .Net 上的锁不同。 Python 的 Lock 一旦解锁,就会释放所有其他在同一个锁上获取()并暂时阻塞的线程。任何线程都可以释放并同时运行。所以,不要做第二次发布,而是做

if l.locked():
    l.release()

如果您想要“队列”行为,其中只有一个线程会在其他一些释放后获得锁的所有权,请使用信号量、事件或其他允许嵌套锁定和排队行为的类似类。

有趣的是,其他语言/loolkits,如.Net,在本地进行锁排队,线程可以按顺序堆积lock.acquire,阻塞并按照获取队列的顺序获取锁对象的所有权,而不是释放一次全部。

(编辑:忘记将父项放入“if l.locked: l.realse()”。更正了代码。Lock.locked 被确认为 cPython 2.6.x、3.x、IronPython 中的现有方法2.6.1)

关于python - 如何知道 Python multiprocessing.Lock 是否被释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3619738/

相关文章:

python - 分离使用 python 多处理模块启动的子进程

python - 从python中的txt文件中提取行

python - 如何在 Python 中读取 Excel 格式的日期?

python - Powershell执行python : redirect print statements only?

multithreading - 加入第一个完成的线程?

java - 如何等待 ThreadPoolExecutor 中的所有任务在超时内完成并且不关闭 Executor?

c# - 在 Task.Run C# 中显示函数的运行时间

python - 如何在 Jupyter Notebook 中更改 Python 版本?

python - 获取worker返回的数据

python - 使用 Xarray 和 Numpy 数组进行多处理