fix error in for/while loop workflows,

This commit is contained in:
windecay
2026-03-25 18:00:04 +08:00
parent fe60aeb0dc
commit 7936f70f58
+66 -29
View File
@@ -130,8 +130,13 @@ class DynamicRAMCacheControl:
def _find_executor(self):
for obj in gc.get_objects():
if obj.__class__.__name__ == 'PromptExecutor':
return obj
try:
if obj.__class__.__name__ == 'PromptExecutor':
return obj
except (ReferenceError, AttributeError):
continue
except Exception:
continue
return None
def _get_cache_set(self, executor):
@@ -147,13 +152,17 @@ class DynamicRAMCacheControl:
return cache_set
def _update_cache_set(self, cache_set, new_cache):
cache_set.outputs = new_cache
if hasattr(cache_set, 'all') and isinstance(cache_set.all, list):
for i, item in enumerate(cache_set.all):
if i == 0:
cache_set.all[i] = new_cache
try:
cache_set.outputs = new_cache
if hasattr(cache_set, 'all') and isinstance(cache_set.all, list):
for i, item in enumerate(cache_set.all):
if i == 0:
cache_set.all[i] = new_cache
except (ReferenceError, AttributeError):
logging.warning("[DynamicRAMCache] Failed to update cache_set: object no longer exists.")
except Exception as e:
logging.warning(f"[DynamicRAMCache] Unexpected error updating cache_set: {e}")
def _switch_to_ram_pressure(self, cache_set, old_cache, caching_mod):
key_class = getattr(old_cache, 'key_class', None)
@@ -162,17 +171,24 @@ class DynamicRAMCacheControl:
new_cache = caching_mod.RAMPressureCache(key_class)
self._migrate_cache_data(old_cache, new_cache)
if getattr(new_cache, 'timestamps', None) is None:
new_cache.timestamps = {}
if getattr(new_cache, 'used_generation', None) is None:
new_cache.used_generation = {}
if getattr(new_cache, 'children', None) is None:
new_cache.children = {}
if getattr(new_cache, 'generation', None) is None:
new_cache.generation = 1
if getattr(new_cache, 'min_generation', None) is None:
new_cache.min_generation = 0
new_cache.timestamps = {}
new_cache.used_generation = {}
new_cache.children = {}
new_cache.generation = 1
new_cache.min_generation = 0
now = time.time()
for key in new_cache.cache:
new_cache.timestamps[key] = now
new_cache.used_generation[key] = 0
if isinstance(getattr(new_cache, 'cache', None), dict) and isinstance(new_cache.timestamps, dict) and isinstance(new_cache.used_generation, dict):
now = time.time()
for key in new_cache.cache:
if key not in new_cache.timestamps:
new_cache.timestamps[key] = now
if key not in new_cache.used_generation:
new_cache.used_generation[key] = 0
self._update_cache_set(cache_set, new_cache)
@@ -188,16 +204,37 @@ class DynamicRAMCacheControl:
def _migrate_cache_data(self, old_cache, new_cache):
"""迁移缓存核心数据"""
# Fix for 'NullCache' object has no attribute 'cache'
if hasattr(old_cache, 'cache'):
new_cache.cache = old_cache.cache
if hasattr(old_cache, 'subcaches'):
new_cache.subcaches = old_cache.subcaches
new_cache.dynprompt = getattr(old_cache, 'dynprompt', None)
new_cache.cache_key_set = getattr(old_cache, 'cache_key_set', None)
new_cache.initialized = getattr(old_cache, 'initialized', False)
try:
old_dict = getattr(old_cache, '__dict__', None)
new_dict = getattr(new_cache, '__dict__', None)
if isinstance(old_dict, dict) and isinstance(new_dict, dict):
new_dict.update(old_dict)
else:
old_cache_data = getattr(old_cache, 'cache', None)
if old_cache_data is not None:
new_cache.cache = old_cache_data
old_subcaches = getattr(old_cache, 'subcaches', None)
if old_subcaches is not None:
new_cache.subcaches = old_subcaches
new_cache.dynprompt = getattr(old_cache, 'dynprompt', None)
new_cache.cache_key_set = getattr(old_cache, 'cache_key_set', None)
new_cache.initialized = getattr(old_cache, 'initialized', False)
if getattr(new_cache, 'cache', None) is None:
new_cache.cache = {}
if getattr(new_cache, 'subcaches', None) is None:
new_cache.subcaches = {}
if hasattr(old_cache, 'is_changed_cache'):
new_cache.is_changed_cache = old_cache.is_changed_cache
if getattr(new_cache, 'is_changed_cache', None) is None:
new_cache.is_changed_cache = {}
except (ReferenceError, AttributeError):
logging.warning("[DynamicRAMCache] Failed to migrate cache data: source object no longer exists.")
except Exception as e:
logging.warning(f"[DynamicRAMCache] Unexpected error migrating cache data: {e}")
class RAMCacheExtremeCleanup(DynamicRAMCacheControl):
def __init__(self):