Как возвращать значение из потока внутри генератора, который является обёрткой для другого генератора
Предлагаю сначала взглянуть на неудачный код:
from threading import Thread
from typing import Generator
class MyClass:
@staticmethod
def wrapped_generator(generator: Generator, updating_delay: float):
data = 0
def thread_function(gen: Generator, delay: float):
global data
while True:
data = next(gen)
time.sleep(delay)
thread = Thread(target=thread_function, args=[generator, updating_delay], daemon=True)
thread.start()
while True:
yield data
Мне нужен генератор-обёртка возвращающий значение, которое независимо обновляется в отдельном потоке.
Это нужно для идентичного подхода. У меня в проекте есть два типа значений: значения, которые я получаю по запросу и значения, которые обновляются независимо, и я должен получать "циферки", которое есть в данный момент.
Пользователь должен один раз указать тип значения, а потом пользоваться генератором забыв о реализации. Поэтому я сначала создаю генераторы, а потом оборачиваю их в зависимости от типа.
Проблема возникла в том, чтобы получить значение из потока thread_function
. Реализовав первое, что пришло в голову, получилось это.
>>> def my_gen():
... a = 0
... while True:
... a += 1
... yield a
>>> wrap_gen = MyClass.wrapped_generator(my_gen(), 1)
>>> next(wrap_gen)
0
>>> next(wrap_gen)
0
>>> data
5
>>> data
8
>>> next(wrap_gen)
0
Python создал глобальную переменную data
в модуле и поток её обновляет, не беря во внимание локальную data
генератора wrapped_generator
.
Я ещё много каких фишек не знаю в Python, поэтому прошу подсказать, как реализовать задуманное?