timeCache.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import threading
  2. import time
  3. import shelve
  4. class TimeCache(threading.Thread):
  5. __oninit = int(time.time())
  6. __probe = 0
  7. __loop = {}
  8. __max = 10
  9. __errors = []
  10. __index = {}
  11. __L1 = {}
  12. def __init__(self):
  13. self.__cache = shelve.open("TimeCacheObject.db", "c")
  14. super().__init__()
  15. def run(self):
  16. while True:
  17. if self.__probe > self.__max:
  18. self.__probe = 0
  19. self.__oninit = int(time.time())
  20. self.__probe = int(time.time()) - self.__oninit
  21. if self.__probe in self.__loop:
  22. if len(self.__loop[self.__probe]) > 0:
  23. for i in self.__loop[self.__probe]:
  24. try:
  25. self.Del(i)
  26. except Exception as e:
  27. self.__errors.append(str(e))
  28. self.__loop[self.__probe] = []
  29. if len(self.__errors) > 0:
  30. print(self.__errors.pop())
  31. def start(self):
  32. super().start()
  33. def __str__(self):
  34. return f"{self.__loop}"
  35. def __getKey(self,ttl):
  36. if (self.__probe + ttl) > self.__max:
  37. self.__max = ttl + self.__probe
  38. self.__loop[self.__max] = []
  39. key = self.__probe + ttl
  40. return key
  41. def Set(self,name,val,ttl):
  42. if name not in self.__index:
  43. key = self.__getKey(ttl)
  44. if key in self.__loop:
  45. self.__loop[key].append(name)
  46. else:
  47. self.__loop[key] = []
  48. self.__loop[key].append(name)
  49. else:
  50. key = self.__index.get(name)
  51. if key in self.__loop:
  52. if name in self.__loop[key]:
  53. self.__loop[key].remove(name)
  54. key = self.__getKey(ttl)
  55. if key in self.__loop:
  56. self.__loop[key].append(name)
  57. else:
  58. self.__loop[key] = []
  59. self.__loop[key].append(name)
  60. self.__cache[name] = val
  61. self.__index[name] = key
  62. if ttl < 30:
  63. self.__L1[name] = val
  64. def Get(self,name):
  65. if self.__L1.get(name):
  66. return self.__L1.get(name)
  67. return self.__cache.get(name)
  68. def Del(self,name):
  69. if self.__cache.get(name):
  70. del self.__cache[name]
  71. if name in self.__index:
  72. del self.__index[name]
  73. if self.__L1.get(name):
  74. del self.__L1[name]
  75. if __name__ == '__main__':
  76. a = TimeCache()
  77. a.start()
  78. a.Set("A","1",1)
  79. a.Set("A", "1", 1)
  80. a.Set("A", "1", 1)
  81. a.Set("A", "1", 1)
  82. a.Set("A", "2", 5)
  83. print(a.Get("A"))
  84. time.sleep(6)
  85. print(a.Get("A"))