【发布时间】:2020-05-03 08:56:21
【问题描述】:
我需要在 Python 中声明一个带超时的变量!实际上,当我们在超时后尝试读取密钥时,我需要类似 REDIS 超时的东西,我们得到 null(无)。我知道可以删除变量,然后读取变量会引发错误,但返回 None 对我来说就足够了。是否有任何现成的库/包来满足这个要求或帮助我在没有样板代码的情况下做到这一点?
【问题讨论】:
标签: python python-3.x timeout
我需要在 Python 中声明一个带超时的变量!实际上,当我们在超时后尝试读取密钥时,我需要类似 REDIS 超时的东西,我们得到 null(无)。我知道可以删除变量,然后读取变量会引发错误,但返回 None 对我来说就足够了。是否有任何现成的库/包来满足这个要求或帮助我在没有样板代码的情况下做到这一点?
【问题讨论】:
标签: python python-3.x timeout
这里是一个带超时变量的自定义类,无需安装第三方包:
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 属性分配一个新值时,内部计时器也会重置。
【讨论】:
试试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 之后不可用。
【讨论】: