This documentation was generated with AI assistance and is still being audited. Some, or potentially a lot, of this information may be inaccurate. Learn more.
defcleanup_all_components(dimension:str|None=None)->None:"""Clean up all components in dimension."""registry,_=_get_registry_and_globals()entries=[entryforentryinregistryifentry.dimension==dimension]ifdimensionelselist(registry)forentryinentries:ifentry.metadata.get("supports_cleanup",False):component=entry.valueifhasattr(component,"cleanup"):try:cleanup_func=component.cleanupifinspect.iscoroutinefunction(cleanup_func):# Run async cleanuploop=Nonetry:loop=asyncio.get_event_loop()ifloop.is_running():# Create task if loop is runningtask=loop.create_task(cleanup_func())# Store reference to prevent garbage collectiontask.add_done_callback(lambdat:None)else:loop.run_until_complete(cleanup_func())exceptRuntimeError:# Create new loop if none existsloop=asyncio.new_event_loop()loop.run_until_complete(cleanup_func())loop.close()else:cleanup_func()exceptExceptionase:get_foundation_logger().error("Component cleanup failed",component=entry.name,dimension=entry.dimension,error=str(e),)
asyncdefinitialize_all_async_components()->None:"""Initialize all async components in dependency order."""registry,_=_get_registry_and_globals()# Get all async componentsasync_components=[entryforentryinregistryifentry.metadata.get("async",False)]# Sort by priority for initialization orderasync_components.sort(key=lambdae:e.metadata.get("priority",0),reverse=True)# Initialize each componentforentryinasync_components:try:awaitinitialize_async_component(entry.name,entry.dimension)exceptExceptionase:get_foundation_logger().error("Failed to initialize async component",component=entry.name,dimension=entry.dimension,error=str(e),)
asyncdefinitialize_async_component(name:str,dimension:str)->Any:"""Initialize component asynchronously."""registry,initialized_components=_get_registry_and_globals()key=(name,dimension)# First, check if already initializedifkeyininitialized_components:returninitialized_components[key]# Registry operations are thread-safe internally, no external lock neededentry=registry.get_entry(name,dimension)ifnotentry:returnNone# If not async or no factory, return current valueifnotentry.metadata.get("async",False):returnentry.valuefactory=entry.metadata.get("factory")ifnotfactory:returnentry.value# Double-check if already initializedifkeyininitialized_components:returninitialized_components[key]# Initialize component outside any locktry:ifinspect.iscoroutinefunction(factory):component=awaitfactory()else:component=factory()# Update both registry and initialized_components# Registry handles its own thread-safetyregistry.register(name=name,value=component,dimension=dimension,metadata=entry.metadata,replace=True,)# Update initialized_components cache# Final check before update (race condition is acceptable here)ifkeynotininitialized_components:initialized_components[key]=componentreturninitialized_components[key]exceptExceptionase:get_foundation_logger().error("Async component initialization failed",component=name,dimension=dimension,error=str(e),)# Return None on failure for resilient behaviorreturnNone