parameters: (self, timeout=None)
docstring: Wait until the thread terminates.
  
          This blocks the calling thread until the thread whose join() method is
          called terminates -- either normally or through an unhandled exception
          or until the optional timeout occurs.
  
          When the timeout argument is present and not None, it should be a
          floating point number specifying a timeout for the operation in seconds
          (or fractions thereof). As join() always returns None, you must call
          is_alive() after join() to decide whether a timeout happened -- if the
          thread is still alive, the join() call timed out.
  
          When the timeout argument is not present or None, the operation will
          block until the thread terminates.
  
          A thread can be join()ed many times.
  
          join() raises a RuntimeError if an attempt is made to join the current
          thread as that would cause a deadlock. It is also an error to join() a
          thread before it has been started and attempts to do so raises the same
          exception.
docstring_summary: Wait until the thread terminates.
docstring_tokens: Wait until the thread terminates .
function: def join(self, timeout=None):
          """Wait until the thread terminates.
  
          This blocks the calling thread until the thread whose join() method is
          called terminates -- either normally or through an unhandled exception
          or until the optional timeout occurs.
  
          When the timeout argument is present and not None, it should be a
          floating point number specifying a timeout for the operation in seconds
          (or fractions thereof). As join() always returns None, you must call
          is_alive() after join() to decide whether a timeout happened -- if the
          thread is still alive, the join() call timed out.
  
          When the timeout argument is not present or None, the operation will
          block until the thread terminates.
  
          A thread can be join()ed many times.
  
          join() raises a RuntimeError if an attempt is made to join the current
          thread as that would cause a deadlock. It is also an error to join() a
          thread before it has been started and attempts to do so raises the same
          exception.
  
          """
          if not self._initialized:
              raise RuntimeError("Thread.__init__() not called")
          if not self._started.is_set():
              raise RuntimeError("cannot join thread before it is started")
          if self is current_thread():
              raise RuntimeError("cannot join current thread")
  
          if timeout is None:
              self._wait_for_tstate_lock()
          else:
              # the behavior of a negative timeout isn't documented, but
              # historically .join(timeout=x) for x<0 has acted as if timeout=0
              self._wait_for_tstate_lock(timeout=max(timeout, 0))
function_tokens: def join ( self , timeout = None ) : if not self . _initialized : raise RuntimeError ( "Thread.__init__() not called" ) if not self . _started . is_set ( ) : raise RuntimeError ( "cannot join thread before it is started" ) if self is current_thread ( ) : raise RuntimeError ( "cannot join current thread" ) if timeout is None : self . _wait_for_tstate_lock ( ) else : # the behavior of a negative timeout isn't documented, but # historically .join(timeout=x) for x<0 has acted as if timeout=0 self . _wait_for_tstate_lock ( timeout = max ( timeout , 0 ) )