benchmarking/utils/future.py (28 lines of code) (raw):

#!/usr/bin/env python ############################################################################## # Copyright 2019-present, Facebook, Inc. # All rights reserved. # # This source code is licensed under the license found in the # LICENSE file in the root directory of this source tree. ############################################################################## from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import threading # Future provides a simple way for callers to asyncronously run a function # and later retrieve the result. Using a normal bool to indicate if the # function has finished is safe due to python's GIL. We don't need any # special atomic operations. class Future(object): def __init__(self, func): self.func = func self.thread = None self.retval = None self.finished = False self.joined = False def start(self, *args, **kwargs): self.thread = threading.Thread( target=self._runAndCapture, args=args, kwargs=kwargs ) self.thread.start() def result(self): if self.joined: return self.retval self.thread.join() self.joined = True return self.retval def isFinished(self): return self.finished def _runAndCapture(self, *args, **kwargs): self.retval = self.func(*args, **kwargs) self.finished = True