from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor def get_pickled_string(): import pickle from decimal import Decimal d = Decimal(1000) import numpy as np return pickle.dumps((d, np.float32)) def task(d): import pickle o = pickle._loads(d) return o # Use a separate process to make the pickled bytes # without importing the modules into our interpreter with ProcessPoolExecutor() as pexecutor: f = pexecutor.submit(get_pickled_string) pickled_d = f.result() import sys assert "decimal" not in sys.modules with ThreadPoolExecutor(max_workers=16) as executor: fs = [executor.submit(task, pickled_d) for i in range(1000)] # also do it here print(task(pickled_d)) print([f.result() for f in fs])