""" Copyright 2018 Johns Hopkins University (Author: Jesus Villalba) Apache 2.0 (http://www.apache.org/licenses/LICENSE-2.0) """ import threading class ThreadSafeIter: """ Takes an iterator/generator and makes it thread-safe by serializing call to the `next` method of given iterator/generator. """ def __init__(self, it): self.it = it self.lock = threading.Lock() def __iter__(self): return self def __next__(self): with self.lock: return self.it.__next__() def next(self): with self.lock: return self.it.next() def threadsafe_generator(f): """ A decorator that takes a generator function and makes it thread-safe. """ def generator(*args, **kwargs): return ThreadSafeIter(f(*args, **kwargs)) return generator