diff --git a/python/src/com/jetbrains/python/packaging/management/PythonPackageManager.kt b/python/src/com/jetbrains/python/packaging/management/PythonPackageManager.kt index 01e972a4ec44..5c2d75cebb6b 100644 --- a/python/src/com/jetbrains/python/packaging/management/PythonPackageManager.kt +++ b/python/src/com/jetbrains/python/packaging/management/PythonPackageManager.kt @@ -346,7 +346,6 @@ abstract class PythonPackageManager(val project: Project, val sdk: Sdk) : Dispos companion object { private val CACHE_KEY = Key.create>?>>>("PythonPackageManagerDependenciesCache") - @RequiresBackgroundThread @Throws(AlreadyDisposedException::class) fun forSdk(project: Project, sdk: Sdk): PythonPackageManager { val pythonPackageManagerService = project.service() diff --git a/python/src/com/jetbrains/python/packaging/management/PythonPackageManagerServiceImpl.kt b/python/src/com/jetbrains/python/packaging/management/PythonPackageManagerServiceImpl.kt index 04ba96911d30..218d3d32066a 100644 --- a/python/src/com/jetbrains/python/packaging/management/PythonPackageManagerServiceImpl.kt +++ b/python/src/com/jetbrains/python/packaging/management/PythonPackageManagerServiceImpl.kt @@ -24,7 +24,16 @@ internal class PythonPackageManagerServiceImpl(private val serviceScope: Corouti private val bridgeCache = ConcurrentHashMap() /** - * Requires Sdk to be Python Sdk and have PythonSdkAdditionalData. + * Returns a cached [PythonPackageManager] for the given [sdk], creating one on first access. + * + * On cache hit the call is effectively free (a [ConcurrentHashMap] lookup). + * On cache miss (once per SDK per project lifetime) the method creates the manager, + * registers Disposer listeners and sets up VFS watchers — this may involve lightweight I/O + * (e.g. flavor detection in [com.jetbrains.python.sdk.getOrCreateAdditionalData]). + * In practice the first call happens during project/SDK setup on a background thread, + * so subsequent EDT callers always get a cached instance. + * + * Requires [sdk] to be a Python SDK with [com.jetbrains.python.sdk.PythonSdkAdditionalData]. */ override fun forSdk(project: Project, sdk: Sdk): PythonPackageManager { val cacheKey = (sdk.getOrCreateAdditionalData()).uuid