当前位置: 首页 > 知识库问答 >
问题:

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

万俟经纶
2023-03-14

Python有一个名为<code>Condition或<code>notify_all()。然而,在调用<code>wait()acquire()wait()方法然后释放锁并等待通知,然后它将继续重新获取锁,您可以运行一些需要线程安全的代码。我的问题是,当调用<code>wait()方法时,<code>条件</code>对象为什么不在内部自动获取锁:

必须调用其他方法并按住关联的锁。wait() 方法释放锁,然后阻塞,直到另一个线程通过调用 notify()notify_all() 来唤醒它。唤醒后,wait() 重新获取锁并返回。还可以指定超时。

因此,在此代码中,我获取了锁,wait方法立即释放它,然后在通知它之后再次获取它,然后我最终释放它。

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

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

共有1个答案

沈乐邦
2023-03-14

如果你没有握着锁,你在等待的事情可能会在你开始等待之前发生。

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

线程 A 想要从队列中读取项目,因此它抓住,检查 deque,并且没有项目。线程 A 调用 condition.wait 以等待另一个线程放入某些内容。

线程B获取< code >锁,调用< code > dequee . append ,并调用< code>condition.notify。由于< code>condition.notify调用,线程A现在被调度唤醒。

假设线程A可以在调用<code>条件之前释放<code>锁。等待。在这种情况下,线程B可能会附加其项并调用<code>条件。在线程A开始等待之前通知。线程A永远不会醒来。

 类似资料:
  • 问题内容: 说你有这个代码 我的问题是,为什么您需要在此处进行while循环。 pthread_cond_wait* 不会只等到信号线程发出 cam_video_cond 信号吗?好的,我知道您可能会遇到以下情况:调用 pthread_cond_wait 时 cam- > status不等于 WAIT_DISPAY ,但是在那种情况下,您可以通过 if 条件检查它,而不是使用 while 。 *

  • 问题内容: 我正在尝试学习pthread_cond_wait的基础知识。在所有用法中,我都可以看到 要么 我的问题是,我们只想cond_wait因为条件为假。那我为什么要忍受明确地放置一个if / while循环的痛苦。我可以理解,在不进行任何if / while检查的情况下,我们将直接击中它,根本不会返回。条件检查是仅用于解决此目的,还是具有其他意义。如果它用于解决不必要的条件等待,则进行条件检

  • 《核心Java》一书中有一个例子,它将资金从一个账户转移到另一个账户。我不知道条件的用处是什么?书中告诉我们: 如果我们只是无条件地锁定和等待,就会出现死锁: 现在,当账户中没有足够的钱时,我们该怎么办?我们等待其他线程添加资金。但是这个线程刚刚获得了对 ,为什么不写呢?

  • 问题内容: 在Bash中,可以通过追加在后台执行命令。如何在Python中完成? 问题答案: 我用。我在模块级别创建一个单例线程池,然后用于启动任务。 该命令给了我一个未来,我可以将它无限期地与其他未来添加到列表中,直到我想收集全部或部分结果为止。 出于所有逻辑和理由,是一个THREAD池而不是一个进程池。 示例(只要安装了请求,就可以在Python 2和3中使用): 这些请求将同时执行,因此运行

  • 嗨,我不知道我做错了什么。I有一个字符串作为参数传递给my类。我必须拆分该字符串并将相应的值赋给成员变量,但它不能正常工作。 这是我的课。 我的输入=Apple$$##12.5$$##9 我犯错了-

  • 我第一次做硒测试。在主页上,我调用了一些AJAX,我希望Selenium等待元素加载完成。我不确定它是否有效,但我只是键入selenium,waitForCondition可以选择。 无论我选择什么,它总是返回“false”。我现在连等待条件都不工作吗? 我如何测试它是否有效?在这些代码中我做错了什么? 如果由自己的类实现,则返回“true” isElementPresent(By.xpath(“