-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstorage.py
More file actions
72 lines (57 loc) · 2.06 KB
/
storage.py
File metadata and controls
72 lines (57 loc) · 2.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import threading
import uuid
import datetime
class StorageItem(object):
__slots__ = [ 'last_operation', 'parser' ]
def __init__(self, parser):
self.last_operation = datetime.datetime.now()
self.parser = parser
def update_time(self):
self.last_operation = datetime.datetime.now()
class Storage(object):
def __init__(self, thread_safe=False):
self.parser_dict = {}
self.thread_safe = thread_safe
self.lock = threading.Lock() if self.thread_safe else None
def _acquire(self):
if self.thread_safe:
self.lock.acquire()
def _release(self):
if self.thread_safe:
self.lock.release()
def _generate_id(self):
while True:
id = str(uuid.uuid4())
if id not in self.parser_dict:
return id
def add(self, parser):
self._acquire()
id = self._generate_id()
self.parser_dict[id] = StorageItem(parser)
self._release()
return id
def get(self, id, ttl):
self._acquire()
current = datetime.datetime.now()
value = None
if id in self.parser_dict:
item = self.parser_dict[id]
if (current - item.last_operation).total_seconds() <= ttl:
value = item.parser
item.update_time()
self._release()
return value
def clean_old(self, ttl):
self._acquire()
current = datetime.datetime.now()
items = self.parser_dict.items()
old_items = filter(lambda x: (current - x[1].last_operation).total_seconds() > ttl, items)
old_ids = map(lambda x: x[0], old_items)
for iter_id in old_ids:
del self.parser_dict[iter_id]
self._release()
def delete(self, id):
self._acquire()
if id in self.parser_dict:
del self.parser_dict[id]
self._release()