当前位置: 首页 > 面试题库 >

如何在Python 2.7中实现超时锁定

云和惬
2023-03-14
问题内容

有没有一种方法可以在Python中实现用于多线程目的的锁定,其acquire方法可以具有任意超时?到目前为止,我发现的唯一可行的解​​决方案是使用轮询,

  • 我发现优雅和低效
  • 不保留锁的有界等待/进度保证作为关键部分问题的解决方案

有没有更好的方法来实现这一目标?


问题答案:

详细阐述史蒂文的评论建议:

import threading
import time

lock = threading.Lock()
cond = threading.Condition(threading.Lock())

def waitLock(timeout):
    with cond:
        current_time = start_time = time.time()
        while current_time < start_time + timeout:
            if lock.acquire(False):
                return True
            else:
                cond.wait(timeout - current_time + start_time)
                current_time = time.time()
    return False

注意事项:

  • 有两个threading.Lock()对象,一个在内部threading.Condition()
  • 操作时cond,获取了锁;wait()但是,该操作将其解锁,因此任何数量的线程都可以观看它。
  • 等待被嵌入到for循环中,以跟踪时间。 threading.Condition可能会因为超时以外的其他原因而收到通知,因此,如果您确实希望时间到期,则仍然需要跟踪时间。
  • 即使有条件,您仍然可以“轮询”真正的锁,因为它可能会唤醒多个线程并争夺该锁。如果lock.acquire失败,则循环返回等待状态。
  • waitLock函数的调用者应lock.release()在acond.notify()后面加上a,以便通知正在等待该函数的其他线程重试获取该锁。该示例中未显示。


 类似资料:
  • 我正在尝试为我正在处理的行设置,直到下一次提交: 我认为应该发生的是,如果两个线程同时尝试写入db,一个线程将在另一个线程之前到达更新操作,第二个线程应该等待10秒,然后抛出。 但相反,线程挂起,直到另一个线程完成,无论设置的超时如何。 看看这个例子: 我预期在第二个请求中,事务将等待超时设置,然后抛出,但它将永远死锁。 Hibernate通过以下方式生成我对数据库的请求: 在这个答案中,我看到<

  • 我对流中的事件进行了键控,我希望通过键来累积,直到超时(例如,5分钟),然后处理累积到该点的事件(忽略该键之后的所有内容,但首先是第一件事)。 我是一个新的Flink,但从概念上来说,我认为我需要一些类似下面代码的东西。 如何在Flink中完成键控窗口超时?

  • 问题内容: 我想使用串行com端口进行通信,并且每次调用read函数调用时都想实现超时。 编辑: 我正在使用Linux OS。如何使用选择函数调用实现? 问题答案: select()有5个参数,首先是最高的文件描述符+ 1,然后是fd_set用于读取,一个用于写入,一个用于异常。最后一个参数是struct timeval,用于超时。错误时返回-1,超时时返回0或设置的集合中文件描述符的数量。

  • 我们的应用程序主要使用Hibernate版本支持的乐观锁定。我们计划在一个特定场景中实现悲观锁定。我没有太多悲观锁定的经验,所以如果这个问题听起来很幼稚,请原谅。 当用户显示更新条目的意图时——我们使用“选择更新”锁定相应的数据库行。现在,如果该用户花了很长时间提交他的更改,但在锁定后忘记了它,我们如何使用一些超时/回滚机制解锁此锁?这样该行就不会长时间保持锁定,并禁止所有其他用户对其进行编辑。

  • 问题内容: 更新记录时,我反复出现锁定超时超出异常的情况。 我正在使用Java Struts 2.1 Hibernate配置。使用的数据库是MYSQL。 任何人都知道如何解决它。 问题答案: 这里有一些建议: “ 锁定等待超时 ”通常发生在事务正在等待要更新的数据行上,而该行已被某些其他事务锁定时。 在大多数情况下,问题出在数据库方面。可能的原因可能是表格设计不当,数据量大,约束等。 请查看这个详

  • 我需要在本机应用程序中实现SSL证书固定。 我对SSL/TLS知之甚少,更不用说钉扎了。我也不是本地的移动开发者,尽管我了解Java,并且在这个项目上学习了Objective-C,足以四处走动。 我开始寻找如何执行这项任务。 不,我的初步搜索导致我提交了该提案,该提案自2016年8月2日以来未收到任何活动。 从中我了解到react native使用OkHttp,它确实支持固定,但我无法从Javas