docs: def _parallel_exec(self, hosts):
          ''' handles mulitprocessing when more than 1 fork is required '''
          if not hosts:
              return
          p = multiprocessing.Pool(self.forks)
          results = []
          #results = p.map(multiprocessing_runner, hosts) # can't handle keyboard interrupt
          results = p.map_async(multiprocessing_runner, hosts).get(9999999)
          p.close()
          p.join()
          return results