class_docstr: ForkedProcess is a substitute for Process that uses os.fork() to generate a new process.
  This is much faster than starting a completely new interpreter and child processes
  automatically have a copy of the entire program state from before the fork. This
  makes it an appealing approach when parallelizing expensive computations. (see
  also Parallelizer)
  
  However, fork() comes with some caveats and limitations:
  
    - fork() is not available on Windows.
    - It is not possible to have a QApplication in both parent and child process
      (unless both QApplications are created _after_ the call to fork())
      Attempts by the forked process to access Qt GUI elements created by the parent
      will most likely cause the child to crash.
    - Likewise, database connections are unlikely to function correctly in a forked child.
    - Threads are not copied by fork(); the new process
      will have only one thread that starts wherever fork() was called in the parent process.
    - Forked processes are unceremoniously terminated when join() is called; they are not
      given any opportunity to clean up. (This prevents them calling any cleanup code that
      was only intended to be used by the parent process)
    - Normally when fork()ing, open file handles are shared with the parent process,
      which is potentially dangerous. ForkedProcess is careful to close all file handles
      that are not explicitly needed--stdout, stderr, and a single pipe to the parent
      process.
    
code: def join(self, timeout=10):
      if self.hasJoined:
          return
      # os.kill(pid, 9)
      try:
          self.close(
              callSync="sync", timeout=timeout, noCleanup=True
          )  ## ask the child process to exit and require that it return a confirmation.
      except IOError:  ## probably remote process has already quit
          pass
  
      try:
          os.waitpid(self.childPid, 0)
      except OSError:  ## probably remote process has already quit
          pass
  
      self.conn.close()  # don't leak file handles!
      self.hasJoined = True
  
imports: import atexit
  import inspect
  import multiprocessing.connection
  import os
  import signal
  import subprocess
  import sys
  import time
  import pickle
  from ..Qt import QT_LIB, mkQApp
  from ..util import cprint
  from .remoteproxy import ClosedError, LocalObjectProxy, NoResultError, ObjectProxy, RemoteEventHandler
  import threading
label_desc: Use image node_id 3 for calling the ForkedProcess obj's underlying member method code with example usage: obj.join(timeout) without return types