code: def evict_from_cache(execution_id: int) -> Iterator[None]:
      """Context manager for mutating an MLMD execution using cache unaware functions.
  
      It is preferable to use `mlmd_execution_atomic_op` for mutating MLMD
      executions but sometimes it may be necessary to use third party functions
      which are not cache aware. Such functions should be invoked within this
      context for proper locking and cache eviction to prevent stale entries.
  
      Args:
        execution_id: Id of the execution to be evicted from cache.
  
      Yields:
        Nothing
      """
      with _execution_id_locks.lock(execution_id):
          _execution_cache.evict(execution_id)
          yield
  
imports: import collections
  import contextlib
  import copy
  import threading
  import typing
  from typing import Callable, Iterator, MutableMapping, Optional
  import cachetools
  from tfx.orchestration import metadata
  from google.protobuf.internal import containers
  from ml_metadata.proto import metadata_store_pb2
label_desc: Use image node_id 2 for calling a global function with example usage: evict_from_cache(execution_id) without return types