Python Glossary English

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Сообщить о неточности