class_docstr: Helper class for async checkpoint.
docstr: Join the async save thread.
  
  The steps for terminating the async save thread:
  1). Put will succeed when the last async save event is done. Putting a false
      triggers the async save thread's while loop to end. We use put instead
      of sync because sync does not have a timeout argument.
  2). Join the async save thread. (The thread may finish before joining.)
docstr_tok: ["Join","the","async","save","thread",".","The","steps","for","terminating","the","async","save","thread",":","1",")",".","Put","will","succeed","when","the","last","async","save","event","is","done",".","Putting","a","false","triggers","the","async","save","thread","'s","while","loop","to","end",".","We","use","put","instead","of","sync","because","sync","does","not","have","a","timeout","argument",".","2",")",".","Join","the","async","save","thread",".","(","The","thread","may","finish","before","joining",".",")"]
code: def _join_async_save_thread(self):
      """Join the async save thread.
  
      The steps for terminating the async save thread:
      1). Put will succeed when the last async save event is done. Putting a false
          triggers the async save thread's while loop to end. We use put instead
          of sync because sync does not have a timeout argument.
      2). Join the async save thread. (The thread may finish before joining.)
      """
      try:
          self._queue.put(False, timeout=300)  # Step-1.
          logging.info("Joining the async save thread.")
          if self._async_save_thread is not None:
              self._async_save_thread.join()  # Step-2.
      except queue.Full:
          logging.error(
              "Timeout waiting for the async save thread; terminating the"
              " thread instead. The last checkpoint may be incomeplete."
          )
      finally:
          self._check_async_thread_error()
  
imports: import atexit
  import copy
  import queue
  import threading
  import time
  import weakref
  from absl import logging
  from tensorflow.python.checkpoint import checkpoint_context
  from tensorflow.python.checkpoint import trackable_view
  from tensorflow.python.distribute import device_util
  from tensorflow.python.eager import context
  from tensorflow.python.eager import def_function
  from tensorflow.python.eager import executor
  from tensorflow.python.framework import ops
  from tensorflow.python.ops import variables
  from tensorflow.python.saved_model.pywrap_saved_model import metrics
  from tensorflow.python.trackable import base
  from tensorflow.python.util import object_identity
label_desc: Use image node_id 6 for calling the AsyncCheckpointHelper obj's underlying member method code with example usage: obj._join_async_save_thread() without return types