|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| """Helper file for running the async data generation process in OSS."""
|
|
|
| import contextlib
|
| import multiprocessing
|
| import multiprocessing.pool
|
|
|
|
|
| def get_forkpool(num_workers, init_worker=None, closing=True):
|
| pool = multiprocessing.Pool(processes=num_workers, initializer=init_worker)
|
| return contextlib.closing(pool) if closing else pool
|
|
|
|
|
| def get_threadpool(num_workers, init_worker=None, closing=True):
|
| pool = multiprocessing.pool.ThreadPool(processes=num_workers,
|
| initializer=init_worker)
|
| return contextlib.closing(pool) if closing else pool
|
|
|
|
|
| class FauxPool(object):
|
| """Mimic a pool using for loops.
|
|
|
| This class is used in place of proper pools when true determinism is desired
|
| for testing or debugging.
|
| """
|
| def __init__(self, *args, **kwargs):
|
| pass
|
|
|
| def map(self, func, iterable, chunksize=None):
|
| return [func(i) for i in iterable]
|
|
|
| def imap(self, func, iterable, chunksize=1):
|
| for i in iterable:
|
| yield func(i)
|
|
|
| def close(self):
|
| pass
|
|
|
| def terminate(self):
|
| pass
|
|
|
| def join(self):
|
| pass
|
|
|
| def get_fauxpool(num_workers, init_worker=None, closing=True):
|
| pool = FauxPool(processes=num_workers, initializer=init_worker)
|
| return contextlib.closing(pool) if closing else pool
|
|
|
|
|
| def worker_job():
|
| return "worker"
|
|
|