gpt4 book ai didi

python - 为什么 python 要求你在等待条件之前获取锁

转载 作者:太空狗 更新时间:2023-10-29 21:48:04 24 4
gpt4 key购买 nike

Python 有一个名为 Condition 的线程对象,它会阻塞一个线程,等待另一个线程对其调用 notifiy()notify_all()。但是,在调用 wait() 方法之前,您必须先调用 acquire() 来获取内部锁。 wait() 方法然后释放锁并等待通知,之后它将继续重新获取锁,您可以运行一些需要线程安全的代码。我的问题是,当您调用 wait() 方法时,为什么 Condition 对象不会在内部自动获取锁:

Python 线程文档

Other methods must be called with the associated lock held. The wait() method releases the lock, and then blocks until another thread awakens it by calling notify() or notify_all(). Once awakened, wait() re-acquires the lock and returns. It is also possible to specify a timeout.

所以在这段代码中,我获得了锁,等待方法立即释放它,然后在它收到通知后再次获得它,然后我最终释放了它。

lock = threading.Lock()
condition = threading.Condition(lock=lock)
...
condition.lock() # acquire the lock
condition.wait() # waiting for another thread to notify me
condition.release() # release the lock

为什么 wait() 调用不只是等待,然后在收到通知后获取锁我不明白为什么我要获取然后释放的锁

最佳答案

如果您没有持有锁,您正在等待的事情可能会在您开始等待之前发生。

假设您有一个自制消息队列,它使用 collections.dequethreading.Lockthreading.Condition 实现变量。

线程 A 想要从队列中读取一个项目,因此它获取了 lock,检查了 deque,但是没有项目。线程 A 调用 condition.wait 等待另一个线程放入一些东西。

线程 B 获取,调用deque.append,并调用condition.notify。由于 condition.notify 调用,线程 A 现在计划唤醒。

想象一下,如果线程 A 可以在调用 condition.wait 之前释放 lock。在这种情况下,线程 B 可能会附加其项目并在线程 A 开始等待之前调用 condition.notify。线程 A 永远不会醒来。

关于python - 为什么 python 要求你在等待条件之前获取锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56919845/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com