code: def clean_proc(proc, wait_for_kill=10):
      '''
      Generic method for cleaning up multiprocessing procs
      '''
      # NoneType and other fun stuff need not apply
      if not proc:
          return
      try:
          waited = 0
          while proc.is_alive():
              proc.terminate()
              waited += 1
              time.sleep(0.1)
              if proc.is_alive() and (waited >= wait_for_kill):
                  log.error('Process did not die with terminate(): %s', proc.pid)
                  os.kill(proc.pid, signal.SIGKILL)
      except (AssertionError, AttributeError):
          # Catch AssertionError when the proc is evaluated inside the child
          # Catch AttributeError when the process dies between proc.is_alive()
          # and proc.terminate() and turns into a NoneType
          pasf clean_proc(proc, wait_for_kill=10):
      '''
      Generic method for cleaning up multiprocessing procs
      '''
      # NoneType and other fun stuff need not apply
      if not proc:
          return
      try:
          waited = 0
          while proc.is_alive():
              proc.terminate()
              waited += 1
              time.sleep(0.1)
              if proc.is_alive() and (waited >= wait_for_kill):
                  log.error('Process did not die with terminate(): %s', proc.pid)
                  os.kill(proc.pid, signal.SIGKILL)
      except (AssertionError, AttributeError):
          # Catch AssertionError when the proc is evaluated inside the child
          # Catch AttributeError when the process dies between proc.is_alive()
          # and proc.terminate() and turns into a NoneType
          pass
docs: Generic method for cleaning up multiprocessing procs