mirror of
https://github.com/comfyanonymous/ComfyUI.git
synced 2026-03-14 13:47:44 +08:00
Adds opt-in process isolation for custom nodes using pyisolate's bwrap sandbox and JSON-RPC bridge. Each isolated node pack runs in its own child process with zero-copy tensor transfer via shared memory. Core infrastructure: - CLI flag --use-process-isolation to enable isolation - Host/child startup fencing via PYISOLATE_CHILD env var - Manifest-driven node discovery and extension loading - JSON-RPC bridge between host and child processes - Shared memory forensics for leak detection Proxy layer: - ModelPatcher, CLIP, VAE, and ModelSampling proxies - Host service proxies (folder_paths, model_management, progress, etc.) - Proxy base with automatic method forwarding Execution integration: - Extension wrapper with V3 hidden param mapping - Runtime helpers for isolated node execution - Host policy for node isolation decisions - Fenced sampler device handling and model ejection parity Serializers for cross-process data transfer: - File3D (GLB), PLY (structured + gaussian), NPZ (streaming frames), VIDEO (VideoFromFile + VideoFromComponents) serializers - data_type flag in SerializerRegistry for type-aware dispatch - Isolated get_temp_directory() fence New core save nodes: - SavePLY and SaveNPZ with comfytype registrations (Ply, Npz) DynamicVRAM compatibility: - comfy-aimdo early init gated by isolation fence Tests: - Integration and policy tests for isolation lifecycle - Manifest loader, host policy, proxy, and adapter unit tests Depends on: pyisolate >= 0.9.2
30 lines
823 B
Python
30 lines
823 B
Python
from __future__ import annotations
|
|
from typing import Dict
|
|
|
|
import folder_paths
|
|
from pyisolate import ProxiedSingleton
|
|
|
|
|
|
class FolderPathsProxy(ProxiedSingleton):
|
|
"""
|
|
Dynamic proxy for folder_paths.
|
|
Uses __getattr__ for most lookups, with explicit handling for
|
|
mutable collections to ensure efficient by-value transfer.
|
|
"""
|
|
|
|
def __getattr__(self, name):
|
|
return getattr(folder_paths, name)
|
|
|
|
# Return dict snapshots (avoid RPC chatter)
|
|
@property
|
|
def folder_names_and_paths(self) -> Dict:
|
|
return dict(folder_paths.folder_names_and_paths)
|
|
|
|
@property
|
|
def extension_mimetypes_cache(self) -> Dict:
|
|
return dict(folder_paths.extension_mimetypes_cache)
|
|
|
|
@property
|
|
def filename_list_cache(self) -> Dict:
|
|
return dict(folder_paths.filename_list_cache)
|