Я замечал, что подача данных является узким местом при обучении моих моделей глубокого обучения. Я видел несколько результатов Google для параллельного генератора, но единственные ответы, которые я нашел, включают следующий фрагмент кода.
class threadsafe_iterator:
def __init__(self, iterator):
self.iterator = iterator
self.lock = threading.Lock()
def __iter__(self):
return self
def __next__(self):
with self.lock: # <-- the lock is here
return next(self.iterator)
def threadsafe_generator(func):
"""Decorator"""
def gen(*a, **kw):
return threadsafe_iterator(func(*a, **kw))
return gen
Проблема заключается в том, что threadsafe_iterator использует блокировку, чтобы обеспечить выполнение только одного экземпляра функции в любой момент времени. Я думаю о создании чего-то еще, такого как схема «производитель-потребитель», но сначала я хотел бы получить отзывы сообщества, или, возможно, уже есть работающее решение.