Python 3.15+threadingпонятие
threading.serialize_iterator()
итераторы в потоках
Обёртка, позволяющая нескольким потокам безопасно брать элементы из одного итератора или генератора: каждый элемент достаётся ровно одному потоку.
Синтаксис
threading.serialize_iterator(iterable)
Генератор нельзя продвигать из двух потоков одновременно: второй вызов next() во время работы первого даёт ValueError: generator already executing, а итераторы на чистом Python могут повредить своё состояние. serialize_iterator ставит вокруг next() (а также send, throw и close, если они есть) блокировку: потоки получают элементы по очереди, без повторов и пропусков. Значения не буферизуются — поток, пришедший во время чужого next(), ждёт. Это раздача работы, а не копирование: если каждому потоку нужна вся последовательность, нужен threading.concurrent_tee.
Примеры
import threading
def numbers():
yield from range(100)
source = threading.serialize_iterator(numbers())
taken = []
def worker():
for n in source:
taken.append(n)
threads = [threading.Thread(target=worker) for _ in range(4)]
for t in threads: t.start()
for t in threads: t.join()
print(len(taken), sorted(taken) == list(range(100))) # → 100 True
См. также
Частые ошибки
Открыть в полном глоссарииdocs.python.orgСообщить о неточности