Skip to content

Commit a0101bc

Browse files
committed
fix async
1 parent abedf5e commit a0101bc

File tree

2 files changed

+46
-13
lines changed

2 files changed

+46
-13
lines changed

fastcore/xtras.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -689,26 +689,34 @@ def mk_dataclass(cls):
689689
# %% ../nbs/03_xtras.ipynb 179
690690
def flexicache(*funcs, maxsize=128):
691691
"Like `lru_cache`, but customisable with policy `funcs`"
692+
import asyncio
692693
def _f(func):
693694
cache,states = {}, [None]*len(funcs)
694-
@wraps(func)
695-
def wrapper(*args, **kwargs):
696-
key = f"{args} // {kwargs}"
695+
def _cache_logic(key, execute_func):
697696
if key in cache:
698697
result,states = cache[key]
699698
if not any(f(state) for f,state in zip(funcs, states)):
700699
cache[key] = cache.pop(key)
701700
return result
702701
del cache[key]
703-
try: newres = func(*args, **kwargs)
702+
try: newres = execute_func()
704703
except:
705704
if key not in cache: raise
706705
cache[key] = cache.pop(key)
707706
return result
708707
cache[key] = (newres, [f(None) for f in funcs])
709708
if len(cache) > maxsize: cache.popitem()
710709
return newres
711-
return wrapper
710+
711+
@wraps(func)
712+
def wrapper(*args, **kwargs):
713+
return _cache_logic(f"{args} // {kwargs}", lambda: func(*args, **kwargs))
714+
715+
@wraps(func)
716+
async def async_wrapper(*args, **kwargs):
717+
return await _cache_logic(f"{args} // {kwargs}", lambda: asyncio.ensure_future(func(*args, **kwargs)))
718+
719+
return async_wrapper if asyncio.iscoroutinefunction(func) else wrapper
712720
return _f
713721

714722
# %% ../nbs/03_xtras.ipynb 181

nbs/03_xtras.ipynb

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2849,26 +2849,34 @@
28492849
"#| export\n",
28502850
"def flexicache(*funcs, maxsize=128):\n",
28512851
" \"Like `lru_cache`, but customisable with policy `funcs`\"\n",
2852+
" import asyncio\n",
28522853
" def _f(func):\n",
28532854
" cache,states = {}, [None]*len(funcs)\n",
2854-
" @wraps(func)\n",
2855-
" def wrapper(*args, **kwargs):\n",
2856-
" key = f\"{args} // {kwargs}\"\n",
2855+
" def _cache_logic(key, execute_func):\n",
28572856
" if key in cache:\n",
28582857
" result,states = cache[key]\n",
28592858
" if not any(f(state) for f,state in zip(funcs, states)):\n",
28602859
" cache[key] = cache.pop(key)\n",
28612860
" return result\n",
28622861
" del cache[key]\n",
2863-
" try: newres = func(*args, **kwargs)\n",
2862+
" try: newres = execute_func()\n",
28642863
" except:\n",
28652864
" if key not in cache: raise\n",
28662865
" cache[key] = cache.pop(key)\n",
28672866
" return result\n",
28682867
" cache[key] = (newres, [f(None) for f in funcs])\n",
28692868
" if len(cache) > maxsize: cache.popitem()\n",
28702869
" return newres\n",
2871-
" return wrapper\n",
2870+
"\n",
2871+
" @wraps(func)\n",
2872+
" def wrapper(*args, **kwargs):\n",
2873+
" return _cache_logic(f\"{args} // {kwargs}\", lambda: func(*args, **kwargs))\n",
2874+
"\n",
2875+
" @wraps(func)\n",
2876+
" async def async_wrapper(*args, **kwargs):\n",
2877+
" return await _cache_logic(f\"{args} // {kwargs}\", lambda: asyncio.ensure_future(func(*args, **kwargs)))\n",
2878+
"\n",
2879+
" return async_wrapper if asyncio.iscoroutinefunction(func) else wrapper\n",
28722880
" return _f"
28732881
]
28742882
},
@@ -2913,10 +2921,23 @@
29132921
"cell_type": "code",
29142922
"execution_count": null,
29152923
"metadata": {},
2916-
"outputs": [],
2924+
"outputs": [
2925+
{
2926+
"data": {
2927+
"text/plain": [
2928+
"3"
2929+
]
2930+
},
2931+
"execution_count": null,
2932+
"metadata": {},
2933+
"output_type": "execute_result"
2934+
}
2935+
],
29172936
"source": [
29182937
"@flexicache(time_policy(10), mtime_policy('000_tour.ipynb'))\n",
2919-
"def cached_func(x, y): return x+y"
2938+
"def cached_func(x, y): return x+y\n",
2939+
"\n",
2940+
"cached_func(1,2)"
29202941
]
29212942
},
29222943
{
@@ -2936,7 +2957,11 @@
29362957
}
29372958
],
29382959
"source": [
2939-
"cached_func(1,2)"
2960+
"@flexicache(time_policy(10), mtime_policy('000_tour.ipynb'))\n",
2961+
"async def cached_func(x, y): return x+y\n",
2962+
"\n",
2963+
"await cached_func(1,2)\n",
2964+
"await cached_func(1,2)"
29402965
]
29412966
},
29422967
{

0 commit comments

Comments
 (0)