Python3 - асинхронная инициализация члена - PullRequest
0 голосов
/ 05 февраля 2019

В моем классе есть член, который можно сгенерировать после длительного расчета.Этот элемент не является "необходимым" для функциональности программы, и я хочу, чтобы он был сгенерирован в каком-то другом потоке или что-то подобное

(В моем случае он, вероятно, должен быть в том же процессе, так как он инициализирует некоторыеСвязанные с ОС вещи, которые должны происходить в одном и том же процессе)

Эта функциональность может использоваться следующим образом:

def generate_object():
    # VERY LARGE CALCULATION INCLUDING READING FILES AND BUILDING SOME DATA STRUCTURE
    return created_object

class MyClass:
    def __init__(self):
        self.__some_member = asyncly generate_object()

    def func(self):
        if self.__some_member is already initialized:
            print(self.__some_member.some_func())
        print("functioning normally without member")

1 Ответ

0 голосов
/ 05 февраля 2019

Это хороший вариант использования для одновременных фьючерсов .

import concurrent.futures

executor = concurrent.futures.ThreadPoolExecutor()

def generate_object():
    ...
    return created_object

class MyClass:
    def __init__(self):
        self.__some_member = executor.submit(generate_object)

    def func(self):
        if self.__some_member.done():
            print(self.__some_member.result().some_func())
        print("functioning normally without member")

ThreadPoolExecutor.submit возвращает объект Future, которыйпредставляет значение, которое может быть еще недоступно.Вы можете проверить, завершено ли будущее, используя done(), и получить доступ к результату (объект, возвращенный generate_object), используя result().Вызов result() для будущего, которое не выполнено, блокирует поток, пока не станет доступен результат.(Но вы также можете указать время ожидания.)

...