class_docstr: Data provider for managing experiment lifecycle.
class_docstr_tok: ["Data","provider","for","managing","experiment","lifecycle","."]
code: def finish_experiment(self, experiment):
      time_finished = time.time()
      key = self._experiment_key(experiment)
      if not isinstance(experiment, str):
          experiment.status = "finished"
          experiment.time_finished = time_finished
  
      experiment_dict = self._get(self._get_experiments_keybase() + key)
  
      experiment_dict["status"] = "finished"
      experiment_dict["time_finished"] = time_finished
  
      self._set(self._get_experiments_keybase() + key, experiment_dict)
  
imports: import time
  from concurrent.futures import ThreadPoolExecutor, wait
  from studio.util import util, logs
  from studio.storage.storage_handler import StorageHandler
  from studio.artifacts.artifact import Artifact
  from studio.experiments.experiment import Experiment, experiment_from_dict
  from studio.storage.storage_setup import get_storage_verbose_level
  from studio.util.util import retry, report_fatal, compression_to_extension, check_for_kb_interrupt
label_desc: Use image node_id 14 for calling the KeyValueProvider obj's underlying member method code with example usage: obj.finish_experiment(experiment) without return types