【问题标题】:Variable with timeout in PythonPython中的超时变量
【发布时间】:2020-05-03 08:56:21
【问题描述】:

我需要在 Python 中声明一个带超时的变量!实际上,当我们在超时后尝试读取密钥时,我需要类似 REDIS 超时的东西,我们得到 null(无)。我知道可以删除变量,然后读取变量会引发错误,但返回 None 对我来说就足够了。是否有任何现成的库/包来满足这个要求或帮助我在没有样板代码的情况下做到这一点?

【问题讨论】:

    标签: python python-3.x timeout


    【解决方案1】:

    这里是一个带超时变量的自定义类,无需安装第三方包:

    import time
    
    
    class TimeoutVar:
        """Variable whose values time out."""
    
        def __init__(self, value, timeout):
            """Store the timeout and value."""
            self._value = value
            self._last_set = time.time()
            self.timeout = timeout
    
        @property
        def value(self):
            """Get the value if the value hasn't timed out."""
            if time.time() - self._last_set < self.timeout:
                return self._value
    
        @value.setter
        def value(self, value, timeout=None):
            """Set the value while resetting the timer."""
            self._value = value
            self._last_set = time.time()
            if timeout is not None:
                self.timeout = timeout
    

    您可以将其保存在一个文件中,例如timeout_var.py,然后在您的代码中导入该类。这可以按如下方式使用:

    import time
    from timeout_var import TimeoutVar
    
    var = TimeoutVar(value=3, timeout=5)
    print(var.value)
    time.sleep(5)
    print(var.value)
    
    var.value = 7
    print(var.value)
    time.sleep(5)
    print(var.value)
    

    输出是:

    3
    None
    7
    None
    

    当您为value 属性分配一个新值时,内部计时器也会重置。

    【讨论】:

      【解决方案2】:

      试试ExpiringDict。它允许您定义具有密钥过期时间的字典。

      首先,安装包:

      pip install expiringdict
      

      这是一个基本用法的例子:

      import time
      from expiringdict import ExpiringDict
      vars_with_expiry = ExpiringDict(max_age_seconds=1, max_len=100)
      vars_with_expiry["my_var"] = "hello"
      print(vars_with_expiry.get("my_var")) # hello
      time.sleep(2)
      print(vars_with_expiry.get("my_var")) # None
      

      vars_with_expiry 是一个字典,过期超时为 1 秒,最大长度为 100 个键(ExpiringDict 在初始化期间需要预定义的大小参数)。

      在上面的示例中,您可以看到密钥my_var 是如何被删除的,并且在sleep 之后不可用。

      【讨论】:

      • @timgeb OP 没有提到它应该是标准库的一部分。
      • @timgeb 我已经用有关安装包的信息更新了我的解决方案。感谢您的反馈!
      • 您的解决方案对我来说没问题。谢谢!
      猜你喜欢
      • 1970-01-01
      • 2015-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      • 2011-09-29
      • 1970-01-01
      相关资源
      最近更新 更多