handles mulitprocessing when more than 1 fork is required

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