Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 21 additions & 11 deletions asyncache/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,23 +68,33 @@ def decorator(func):

async def wrapper(*args, **kwargs):
k = key(*args, **kwargs)
try:
async with lock:
return cache[k]

except KeyError:
pass # key not found
async with lock:
try:
task = cache[k]

cleanup = False

except KeyError:
val = func(*args, **kwargs)

task = asyncio.Task(val)

val = await func(*args, **kwargs)
cache[k] = task

cleanup = True

try:
async with lock:
cache[k] = val
r = await task

except ValueError:
pass # val too large
return r

return val
except Exception:
if cleanup:
async with lock:
del cache[k]

raise

else:

Expand Down
8 changes: 3 additions & 5 deletions tests/test_cached.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,6 @@ def test_decorator_typed(self):

def test_decorator_lock(self):
class Lock(object):

count = 0

def __enter__(self):
Expand Down Expand Up @@ -194,7 +193,6 @@ async def test_decorator_typed_async(self):
@sync
async def test_decorator_lock_async(self):
class Lock(object):

count = 0

async def __aenter__(self):
Expand All @@ -209,11 +207,11 @@ async def __aexit__(self, *exc):
self.assertEqual(len(cache), 0)
self.assertEqual(wrapper.__wrapped__, self.coro)
self.assertEqual((await wrapper(0)), 0)
self.assertEqual(Lock.count, 2)
self.assertEqual(Lock.count, 1)
self.assertEqual((await wrapper(1)), 1)
self.assertEqual(Lock.count, 4)
self.assertEqual(Lock.count, 2)
self.assertEqual((await wrapper(1)), 1)
self.assertEqual(Lock.count, 5)
self.assertEqual(Lock.count, 3)


class DictWrapperTest(unittest.TestCase, SyncMixin, AsyncMixin):
Expand Down