|
2849 | 2849 | "#| export\n", |
2850 | 2850 | "def flexicache(*funcs, maxsize=128):\n", |
2851 | 2851 | " \"Like `lru_cache`, but customisable with policy `funcs`\"\n", |
| 2852 | + " import asyncio\n", |
2852 | 2853 | " def _f(func):\n", |
2853 | 2854 | " 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", |
2857 | 2856 | " if key in cache:\n", |
2858 | 2857 | " result,states = cache[key]\n", |
2859 | 2858 | " if not any(f(state) for f,state in zip(funcs, states)):\n", |
2860 | 2859 | " cache[key] = cache.pop(key)\n", |
2861 | 2860 | " return result\n", |
2862 | 2861 | " del cache[key]\n", |
2863 | | - " try: newres = func(*args, **kwargs)\n", |
| 2862 | + " try: newres = execute_func()\n", |
2864 | 2863 | " except:\n", |
2865 | 2864 | " if key not in cache: raise\n", |
2866 | 2865 | " cache[key] = cache.pop(key)\n", |
2867 | 2866 | " return result\n", |
2868 | 2867 | " cache[key] = (newres, [f(None) for f in funcs])\n", |
2869 | 2868 | " if len(cache) > maxsize: cache.popitem()\n", |
2870 | 2869 | " 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", |
2872 | 2880 | " return _f" |
2873 | 2881 | ] |
2874 | 2882 | }, |
|
2913 | 2921 | "cell_type": "code", |
2914 | 2922 | "execution_count": null, |
2915 | 2923 | "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 | + ], |
2917 | 2936 | "source": [ |
2918 | 2937 | "@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)" |
2920 | 2941 | ] |
2921 | 2942 | }, |
2922 | 2943 | { |
|
2936 | 2957 | } |
2937 | 2958 | ], |
2938 | 2959 | "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)" |
2940 | 2965 | ] |
2941 | 2966 | }, |
2942 | 2967 | { |
|
0 commit comments