class_docstr: This class is used to receive logging messages sent from worker processes that
  are running in different PROCESSES (not threads).
  
  The logging will work when using threads. However, when using processes (multiprocessing.Process) :class:`multiprocessing.Process`
  , the present class
  is needed in the main process to receive the logging messages from the worker processes properly in the main console output.
class_docstr_tok: ["This","class","is","used","to","receive","logging","messages","sent","from","worker","processes","that","are","running","in","different","PROCESSES","(","not","threads",")",".","The","logging","will","work","when","using","threads",".","However",",","when","using","processes","(","multiprocessing.Process",")",":","class",":","`","multiprocessing.Process","`",",","the","present","class","is","needed","in","the","main","process","to","receive","the","logging","messages","from","the","worker","processes","properly","in","the","main","console","output","."]
docstr: Send the None signal for the thread to finish, and join on the thread to finish it.
  Note that once this method is called, the thread will finish and the threading.Thread
  object will be destroyed. Therefore, this method should be called only once and after
  the producers of parallel logging messages finished their job.
  
  Timeout is in seconds.
docstr_tok: ["Send","the","None","signal","for","the","thread","to","finish",",","and","join","on","the","thread","to","finish","it",".","Note","that","once","this","method","is","called",",","the","thread","will","finish","and","the","threading.Thread","object","will","be","destroyed",".","Therefore",",","this","method","should","be","called","only","once","and","after","the","producers","of","parallel","logging","messages","finished","their","job",".","Timeout","is","in","seconds","."]
code: def join(self, timeout: float = None):
      """
      Send the None signal for the thread to finish, and join on the thread to finish it.
      Note that once this method is called, the thread will finish and the threading.Thread
      object will be destroyed. Therefore, this method should be called only once and after
      the producers of parallel logging messages finished their job.
  
      Timeout is in seconds.
      """
      self.logging_queue.put(None)
      self.logging_thread.join(timeout=timeout)
      self.logging_queue.close()
      self.logging_queue.cancel_join_thread()
      self.logging_queue.join_thread()
  
imports: import logging
  import re
  import sys
  from threading import Thread
  from io import StringIO
  from multiprocessing import Queue
  from typing import IO, Dict, List, Optional
label_desc: Use image node_id 4 for calling the ParallelLoggingConsumerThread obj's underlying member method code with example usage: obj.join(timeout) without return types