我的班级有一个可以经过长时间计算而生成的成员。该成员对于程序的功能不是“必需的”,我希望在其他线程或类似的线程中生成它
(就我而言,它可能必须在同一进程中,因为它初始化了一些必须在同一进程中发生的与操作系统相关的东西)
此功能可以像这样使用:
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")
答案 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()
会阻塞线程,直到结果可用为止。 (但是您也可以指定超时时间。)