Переменная с таймаутом в Python - PullRequest
1 голос
/ 03 мая 2020

Мне нужно объявить переменную с таймаутом в Python! На самом деле мне нужно что-то вроде тайм-аута REDIS, когда мы пытаемся прочитать ключ после тайм-аута, мы получаем null (Нет). Я знаю, что переменная может быть удалена, и после этого чтение переменной вызовет ошибки, но мне достаточно возврата None. Есть ли готовая библиотека / пакет, чтобы выполнить это требование или помочь мне сделать это без стандартного кода?

Ответы [ 2 ]

2 голосов
/ 03 мая 2020

Вот пользовательский класс для переменной с тайм-аутом, без необходимости установки стороннего пакета:

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 голосов
/ 03 мая 2020

Попробуйте ExpiringDict. Он позволяет вам определить словарь с истечением срока действия ключа.

Сначала установите пакет:

pip install expiringdict

Вот пример использования basi c:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...