Some checks are pending
CI / Test (Python 3.10 on macos-latest) (push) Waiting to run
CI / Test (Python 3.11 on macos-latest) (push) Waiting to run
CI / Test (Python 3.12 on macos-latest) (push) Waiting to run
CI / Test (Python 3.8 on macos-latest) (push) Waiting to run
CI / Test (Python 3.9 on macos-latest) (push) Waiting to run
CI / Test (Python 3.10 on ubuntu-latest) (push) Waiting to run
CI / Test (Python 3.11 on ubuntu-latest) (push) Waiting to run
CI / Test (Python 3.12 on ubuntu-latest) (push) Waiting to run
CI / Test (Python 3.8 on ubuntu-latest) (push) Waiting to run
CI / Test (Python 3.9 on ubuntu-latest) (push) Waiting to run
CI / Test (Python 3.10 on windows-latest) (push) Waiting to run
CI / Test (Python 3.11 on windows-latest) (push) Waiting to run
CI / Test (Python 3.12 on windows-latest) (push) Waiting to run
CI / Test (Python 3.8 on windows-latest) (push) Waiting to run
CI / Test (Python 3.9 on windows-latest) (push) Waiting to run
CI / Lint (push) Waiting to run
CI / Release (push) Blocked by required conditions
Documentation / Build Documentation (push) Waiting to run
242 lines
8.0 KiB
Python
242 lines
8.0 KiB
Python
# sikuwa/cpp_cache/__init__.py
|
||
# Python包装器模块,用于使用C++实现的智能缓存系统
|
||
|
||
import os
|
||
import sys
|
||
import json
|
||
import hashlib
|
||
from pathlib import Path
|
||
|
||
# 尝试导入C++扩展模块
|
||
try:
|
||
from .pysmartcache import (
|
||
lru_cache_new,
|
||
lru_cache_contains,
|
||
lru_cache_put,
|
||
lru_cache_get,
|
||
lru_cache_remove,
|
||
lru_cache_clear
|
||
)
|
||
cpp_extension_loaded = True
|
||
except ImportError as e:
|
||
print(f"Warning: pysmartcache C++ extension not found. Using fallback implementation. Error: {e}")
|
||
cpp_extension_loaded = False
|
||
|
||
# Python回退实现
|
||
if not cpp_extension_loaded:
|
||
class FallbackLRUCache:
|
||
"""纯Python实现的LRU缓存"""
|
||
|
||
def __init__(self, max_size=1000):
|
||
self.max_size = max_size
|
||
self.cache = {}
|
||
self.usage_order = []
|
||
|
||
def contains(self, key):
|
||
return key in self.cache
|
||
|
||
def put(self, key, value):
|
||
if key in self.cache:
|
||
# 移动到最近使用
|
||
self.usage_order.remove(key)
|
||
elif len(self.cache) >= self.max_size:
|
||
# 移除最久未使用的
|
||
oldest = self.usage_order.pop(0)
|
||
del self.cache[oldest]
|
||
|
||
self.cache[key] = value
|
||
self.usage_order.append(key)
|
||
return True
|
||
|
||
def get(self, key):
|
||
if key not in self.cache:
|
||
return ""
|
||
|
||
# 移动到最近使用
|
||
self.usage_order.remove(key)
|
||
self.usage_order.append(key)
|
||
return self.cache[key]
|
||
|
||
def remove(self, key):
|
||
if key in self.cache:
|
||
del self.cache[key]
|
||
self.usage_order.remove(key)
|
||
return True
|
||
return False
|
||
|
||
def clear(self):
|
||
self.cache.clear()
|
||
self.usage_order.clear()
|
||
return True
|
||
|
||
# 模拟C++扩展的函数
|
||
def lru_cache_new(max_size=1000):
|
||
return FallbackLRUCache(max_size)
|
||
|
||
def lru_cache_contains(cache, key):
|
||
return cache.contains(key)
|
||
|
||
def lru_cache_put(cache, key, value):
|
||
return cache.put(key, value)
|
||
|
||
def lru_cache_get(cache, key):
|
||
return cache.get(key)
|
||
|
||
def lru_cache_remove(cache, key):
|
||
return cache.remove(key)
|
||
|
||
def lru_cache_clear(cache):
|
||
return cache.clear()
|
||
|
||
# LRUCache类的Python包装器
|
||
class LRUCache:
|
||
"""LRU (Least Recently Used) 缓存的Python包装器"""
|
||
|
||
def __init__(self, max_size=1000):
|
||
"""创建一个新的LRU缓存"""
|
||
self.cache = lru_cache_new(max_size)
|
||
|
||
def contains(self, key):
|
||
"""检查缓存中是否包含指定的键"""
|
||
return lru_cache_contains(self.cache, key)
|
||
|
||
def put(self, key, value):
|
||
"""将键值对放入缓存"""
|
||
return lru_cache_put(self.cache, key, value)
|
||
|
||
def get(self, key):
|
||
"""从缓存中获取指定键的值"""
|
||
return lru_cache_get(self.cache, key)
|
||
|
||
def remove(self, key):
|
||
"""从缓存中移除指定的键"""
|
||
return lru_cache_remove(self.cache, key)
|
||
|
||
def clear(self):
|
||
"""清空缓存"""
|
||
lru_cache_clear(self.cache)
|
||
|
||
# 纯Python实现的BuildCache
|
||
class BuildCache:
|
||
"""构建缓存系统"""
|
||
|
||
def __init__(self, cache_dir=".cache", max_size=1000000000):
|
||
"""创建一个新的构建缓存"""
|
||
self.cache_dir = Path(cache_dir)
|
||
self.cache_dir.mkdir(parents=True, exist_ok=True)
|
||
self.max_size = max_size
|
||
self.cache_file = self.cache_dir / "build_cache.json"
|
||
self.cache = self._load_cache()
|
||
|
||
def _load_cache(self):
|
||
"""从文件加载缓存"""
|
||
if self.cache_file.exists():
|
||
try:
|
||
with open(self.cache_file, 'r', encoding='utf-8') as f:
|
||
return json.load(f)
|
||
except Exception:
|
||
pass
|
||
return {}
|
||
|
||
def _save_cache(self):
|
||
"""保存缓存到文件"""
|
||
try:
|
||
with open(self.cache_file, 'w', encoding='utf-8') as f:
|
||
json.dump(self.cache, f, indent=2, ensure_ascii=False)
|
||
except Exception as e:
|
||
print(f"Error saving cache: {e}")
|
||
|
||
def set_cache_strategy(self, strategy):
|
||
"""设置缓存策略 ("lru" 或 "lfu")"""
|
||
# Python实现不支持策略切换,这里只是为了兼容接口
|
||
pass
|
||
|
||
def cache_build_result(self, target, command, dependencies, result):
|
||
"""缓存构建结果"""
|
||
cache_key = self._generate_cache_key(target, command, dependencies)
|
||
self.cache[cache_key] = {
|
||
"result": result,
|
||
"dependencies": dependencies,
|
||
"command": command,
|
||
"timestamp": os.path.getmtime(__file__)
|
||
}
|
||
self._save_cache()
|
||
return True
|
||
|
||
def get_cached_build_result(self, target, command, dependencies):
|
||
"""获取缓存的构建结果"""
|
||
cache_key = self._generate_cache_key(target, command, dependencies)
|
||
if cache_key in self.cache:
|
||
return self.cache[cache_key]["result"]
|
||
return ""
|
||
|
||
def needs_rebuild(self, target, command, dependencies):
|
||
"""检查是否需要重新构建"""
|
||
cache_key = self._generate_cache_key(target, command, dependencies)
|
||
if cache_key not in self.cache:
|
||
return True
|
||
|
||
# 这里简单地总是返回False,因为我们已经生成了包含所有依赖的缓存键
|
||
# 在实际实现中,可以检查依赖文件是否有变化
|
||
return False
|
||
|
||
def _generate_cache_key(self, target, command, dependencies):
|
||
"""生成缓存键"""
|
||
# 合并所有信息生成唯一的缓存键
|
||
all_info = f"{target}|{command}|{json.dumps(dependencies, sort_keys=True)}"
|
||
return hashlib.sha256(all_info.encode()).hexdigest()
|
||
|
||
def clean_all_cache(self):
|
||
"""清理所有缓存"""
|
||
self.cache.clear()
|
||
self._save_cache()
|
||
return True
|
||
|
||
def dump_stats(self):
|
||
"""打印缓存统计信息"""
|
||
print(f"Build Cache Statistics:")
|
||
print(f" Cache directory: {self.cache_dir}")
|
||
print(f" Number of cached items: {len(self.cache)}")
|
||
|
||
# 为BuildCache创建类似C++扩展的函数接口
|
||
def build_cache_new(cache_dir=".cache", max_size=1000000000):
|
||
return BuildCache(cache_dir, max_size)
|
||
|
||
def build_cache_set_cache_strategy(cache, strategy):
|
||
return cache.set_cache_strategy(strategy)
|
||
|
||
def build_cache_cache_build_result(cache, target, command, dependencies, result):
|
||
# 如果dependencies是字符串,将其转换为列表
|
||
if isinstance(dependencies, str):
|
||
dependencies = [dependencies]
|
||
return cache.cache_build_result(target, command, dependencies, result)
|
||
|
||
def build_cache_get_cached_build_result(cache, target, command, dependencies):
|
||
# 如果dependencies是字符串,将其转换为列表
|
||
if isinstance(dependencies, str):
|
||
dependencies = [dependencies]
|
||
return cache.get_cached_build_result(target, command, dependencies)
|
||
|
||
def build_cache_needs_rebuild(cache, target, command, dependencies):
|
||
# 如果dependencies是字符串,将其转换为列表
|
||
if isinstance(dependencies, str):
|
||
dependencies = [dependencies]
|
||
return cache.needs_rebuild(target, command, dependencies)
|
||
|
||
def build_cache_clean_all_cache(cache):
|
||
return cache.clean_all_cache()
|
||
|
||
def build_cache_dump_build_cache_stats(cache):
|
||
return cache.dump_stats()
|
||
|
||
# 导出所有函数
|
||
globals().update({
|
||
'build_cache_new': build_cache_new,
|
||
'build_cache_set_cache_strategy': build_cache_set_cache_strategy,
|
||
'build_cache_cache_build_result': build_cache_cache_build_result,
|
||
'build_cache_get_cached_build_result': build_cache_get_cached_build_result,
|
||
'build_cache_needs_rebuild': build_cache_needs_rebuild,
|
||
'build_cache_clean_all_cache': build_cache_clean_all_cache,
|
||
'build_cache_dump_build_cache_stats': build_cache_dump_build_cache_stats
|
||
})
|