import logging from multiprocessing import Pool, TimeoutError logging.basicConfig(level=logging.INFO) def timeout(func, args=None, kwds=None, timeout=10): """Call function and wait until timeout. Cannot make into a decorator, fails in pickling function. """ args = args or [] kwds = kwds or {} with Pool(processes=1) as pool: res = pool.apply_async(func, args, kwds) try: return res.get(timeout) except TimeoutError: logging.exception( 'Calling %s%s timed out after %ss', func.__name__, tuple(args), timeout ) raise