Как возвращать значение из потока внутри генератора, который является обёрткой для другого генератора

Рейтинг: 0Ответов: 1Опубликовано: 17.07.2023

Предлагаю сначала взглянуть на неудачный код:

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, поэтому прошу подсказать, как реализовать задуманное?

Ответы

▲ 1Принят

Спасибо andreymal за ответ! Работает, как ожидается.

global datanonlocal data