Python3-异步初始化成员

时间:2019-02-05 17:41:14

标签: python-3.x asynchronous python-asyncio

我的班级有一个可以经过长时间计算而生成的成员。该成员对于程序的功能不是“必需的”,我希望在其他线程或类似的线程中生成它

(就我而言,它可能必须在同一进程中,因为它初始化了一些必须在同一进程中发生的与操作系统相关的东西)

此功能可以像这样使用:

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 :(得分:1)

这是concurrent futures的好用例。

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()测试将来是否完成,并使用result()访问结果(由generate_object返回的对象)。在未完成的将来调用result()会阻塞线程,直到结果可用为止。 (但是您也可以指定超时时间。)