Python 3.15+threadingфункция
threading.synchronized_iterator()
итераторы в потоках
Декоратор для генераторной функции: каждый возвращаемый ею итератор сразу обёрнут в serialize_iterator и безопасен для нескольких потоков.
Синтаксис
@threading.synchronized_iterator
def gen(...):
yield ...
Удобнее, чем оборачивать каждый вызов вручную: @threading.synchronized_iterator над def squares(n) — и любой squares(10) можно раздавать потокам. Имя, документация и __wrapped__ исходной функции сохраняются. Блокировка своя у каждого итератора, а не общая на функцию: два вызова генератора не мешают друг другу. Каждый элемент получает ровно один поток — это очередь работы, а не рассылка.
Примеры
import threading
@threading.synchronized_iterator
def squares(n):
for x in range(n):
yield x * x
print(squares.__name__) # → squares
got = []
it = squares(50)
threads = [threading.Thread(target=lambda: got.extend(it)) for _ in range(3)]
for t in threads: t.start()
for t in threads: t.join()
print(sorted(got) == [x * x for x in range(50)]) # → True
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности