class_docstr: Class to manage the multi-threaded data ingestion process.
  
  This class will manage the data ingestion process which is multi-threaded.
  
  Attributes:
      feature_group_name (str): name of the Feature Group.
      sagemaker_fs_runtime_client_config (Config): instance of the Config class
          for boto calls.
      sagemaker_session (Session): session instance to perform boto calls.
      data_frame (DataFrame): pandas DataFrame to be ingested to the given feature group.
      max_workers (int): number of threads to create.
      max_processes (int): number of processes to create. Each process spawns
          ``max_workers`` threads.
      profile_name (str): the profile credential should be used for ``PutRecord``
          (default: None).
class_docstr_tok: ["Class","to","manage","the","multi-threaded","data","ingestion","process",".","This","class","will","manage","the","data","ingestion","process","which","is","multi-threaded",".","Attributes",":","feature_group_name","(","str",")",":","name","of","the","Feature","Group",".","sagemaker_fs_runtime_client_config","(","Config",")",":","instance","of","the","Config","class","for","boto","calls",".","sagemaker_session","(","Session",")",":","session","instance","to","perform","boto","calls",".","data_frame","(","DataFrame",")",":","pandas","DataFrame","to","be","ingested","to","the","given","feature","group",".","max_workers","(","int",")",":","number","of","threads","to","create",".","max_processes","(","int",")",":","number","of","processes","to","create",".","Each","process","spawns","``","max_workers","``","threads",".","profile_name","(","str",")",":","the","profile","credential","should","be","used","for","``","PutRecord","``","(","default",":","None",")","."]
docstr: Wait for the ingestion process to finish.
  
  Args:
      timeout (Union[int, float]): ``concurrent.futures.TimeoutError`` will be raised
          if timeout is reached.
docstr_tok: ["Wait","for","the","ingestion","process","to","finish",".","Args",":","timeout","(","Union","[","int",",","float","]",")",":","``","concurrent.futures.TimeoutError","``","will","be","raised","if","timeout","is","reached","."]
code: def wait(self, timeout=None):
      """Wait for the ingestion process to finish.
  
      Args:
          timeout (Union[int, float]): ``concurrent.futures.TimeoutError`` will be raised
              if timeout is reached.
      """
      try:
          results = self._async_result.get(timeout=timeout)
      except KeyboardInterrupt as i:
          # terminate workers abruptly on keyboard interrupt.
          self._processing_pool.terminate()
          self._processing_pool.close()
          self._processing_pool.clear()
          raise i
      else:
          # terminate normally
          self._processing_pool.close()
          self._processing_pool.clear()
  
      self._failed_indices = [
          failed_index
          for failed_indices in results
          for failed_index in failed_indices
      ]
  
      if len(self._failed_indices) > 0:
          raise IngestionError(
              self._failed_indices,
              f"Failed to ingest some data into FeatureGroup {self.feature_group_name}",
          )
  
imports: from __future__ import absolute_import
  import copy
  import logging
  import math
  import os
  import tempfile
  from concurrent.futures import as_completed
  from concurrent.futures import ThreadPoolExecutor
  from typing import Optional, Sequence, List, Dict, Any, Union
  from urllib.parse import urlparse
  from multiprocessing.pool import AsyncResult
  import signal
  import attr
  import pandas
  from pandas import DataFrame
  import boto3
  from botocore.config import Config
  from pathos.multiprocessing import ProcessingPool
  from sagemaker.config import FEATURE_GROUP_ROLE_ARN_PATH, FEATURE_GROUP_OFFLINE_STORE_KMS_KEY_ID_PATH, FEATURE_GROUP_ONLINE_STORE_KMS_KEY_ID_PATH
  from sagemaker.session import Session
  from sagemaker.feature_store.feature_definition import FeatureDefinition, FeatureTypeEnum
  from sagemaker.feature_store.inputs import OnlineStoreConfig, OnlineStoreSecurityConfig, S3StorageConfig, OfflineStoreConfig, DataCatalogConfig, FeatureValue, FeatureParameter, TableFormatEnum, DeletionModeEnum, TtlDuration, OnlineStoreConfigUpdate, OnlineStoreStorageTypeEnum
  from sagemaker.utils import resolve_value_from_config, format_tags, Tags
label_desc: Use image node_id 3 for calling the IngestionManagerPandas obj's underlying member method code with example usage: obj.wait(timeout) without return types