diff --git a/oml/cache.py b/oml/cache.py index 28d521c..77caf19 100644 --- a/oml/cache.py +++ b/oml/cache.py @@ -1,3 +1,4 @@ +from threading import Lock import time class Cache(dict): @@ -5,6 +6,12 @@ class Cache(dict): def __init__(self, ttl=10): self._ttl = ttl self._added = {} + self._lock = {} + + def lock(self, key): + if key not in self._lock: + self._lock[key] = Lock() + self._lock[key].acquire() def get(self, key): now = time.time() @@ -12,12 +19,18 @@ class Cache(dict): if value < now: self._added.pop(k, None) self.pop(k, None) + self._lock.pop(k, None) + if key in self._lock: + self._lock[key].acquire() return dict.get(self, key) def set(self, key, value, ttl=None): ttl = ttl or self._ttl self._added[key] = time.time() + ttl dict.__setitem__(self, key, value) + q = self._lock.pop(key, None) + if q: + q.release() def delete(self, key): if key in self._added: diff --git a/oml/item/api.py b/oml/item/api.py index 64cce9f..cec68bb 100644 --- a/oml/item/api.py +++ b/oml/item/api.py @@ -3,7 +3,6 @@ import json import hashlib import os -import unicodedata from sqlalchemy.orm import load_only from sqlalchemy.sql.expression import text @@ -52,11 +51,13 @@ def find(data): key = 'group:' + hashlib.sha1(json.dumps(_keydata, sort_keys=True).encode('utf-8')).hexdigest() g = state.cache.get(key) if g is None: + state.cache.lock(key) items = q['qs'].options(load_only('id')) qs = models.Find.query.filter_by(key=q['group']) if items.first(): qs = qs.filter(models.Find.item_id.in_(items)) - for f in qs.values('value', 'findvalue', 'sortvalue'): + values = list(qs.values('value', 'findvalue', 'sortvalue')) + for f in values: value = f[0] findvalue = f[1] sortvalue = f[2] diff --git a/oml/item/title_api.py b/oml/item/title_api.py index 64ee84f..b34a70c 100644 --- a/oml/item/title_api.py +++ b/oml/item/title_api.py @@ -72,6 +72,7 @@ def findTitles(data): key = 'title:' + hashlib.sha1(json.dumps(_keydata, sort_keys=True).encode('utf-8')).hexdigest() titles = state.cache.get(key) if titles is None: + state.cache.lock(key) response['items'] = [] _titles = {} for i in q['qs']: