Source code for gemstone.discovery.cache
import time
import threading
[docs]class DummyCache(object):
"""
Dummy remote service cache. Always returns ``None`` which triggers a
service registry query.
Example usage:
::
class MyMicroService(MicroService):
# ...
service_registry_cache = DummyCache()
# ...
"""
def __init__(self):
pass
def add_entry(self, name, remote_service):
pass
def get_entry(self, name):
pass
class CacheEntry(object):
def __init__(self, name, remote_service):
self.created = time.time()
self.name = name
self.remote_service = remote_service
def is_still_valid(self, max_age):
return (time.time() - self.created) < max_age
[docs]class ServiceDiscoveryCache(object):
def __init__(self, cache_lifetime_in_seconds):
"""
Service discovery cache that keeps entries in memory for
a constant period of time.
Example usage:
::
class MyMicroService(MicroService):
# ...
service_registry_cache = ServiceDiscoveryCache(60) # keeps entries for one minute
# ...
:param cache_lifetime_in_seconds: int that specifies the cache entry lifetime
"""
self.ttl = cache_lifetime_in_seconds
self.container = {}
self.container_lock = threading.Lock()
def add_entry(self, name, remote_service):
with self.container_lock:
self.container.setdefault(name, [])
self.container[name].append(CacheEntry(name, remote_service))
def get_entry(self, name):
self.expire_entries()
with self.container_lock:
for entry in self.container.get(name, []):
if entry.is_still_valid(self.ttl):
return entry
def expire_entries(self):
with self.container_lock:
for _, entries in self.container.items():
i = 0
while i < len(entries):
current = entries[i]
if current.is_still_valid(self.ttl):
i += 1
else:
del entries[i]