使用线程来加速缓慢的上下文管理器初始化



我正在从python2.7模块中消费,我无法轻易更改。这个模块有一个类的工厂,这个类是一个上下文管理器。这对于管理对象的生命周期非常有用,但是初始化该类需要等待基于云的资源的创建,并且可能需要很长时间才能运行。在我的程序范围内,我需要创建如下两个对象:

import immutable_module
cloud_resource_name1 = "load_ai_model"
cloud_resource_name2 = "create_input_output_model"
with immutable_module.create_remote_cloud_resource(cloud_resource_name1) as a, 
immutable_module.create_remote_cloud_resource(cloud_resource_name2) as b: 
result = __do_imporant_thing(a, b)
print(result)

是否有一种方法可以使用线程并发地调用这两个上下文管理器来加快加载时间?

在做了更多的研究之后,我找到了一个解决方案,但它可能不是最好的答案。该解决方案依赖于为上下文管理器手动调用__enter____exit__

import immutable_module
cloud_resource_name1 = "load_ai_model"
cloud_resource_name2 = "create_input_output_model"
a_context = immutable_module.create_remote_cloud_resource(cloud_resource_name1) 
b_context = immutable_module.create_remote_cloud_resource(cloud_resource_name2)
a = None
b = None
try:
def __set_a():
global a
a = a_context.__enter__()
def __set_b():
global b
b = b_context.__enter__()
a_thread = Thread(target=__set_a)
b_thread = Thread(target=__set_b)
a_thread.start()
b_thread.start()
a_thread.join()
b_thread.join()
result = __do_imporant_thing(a, b)
finally:
try:
if a is not None:
a_context.__exit__(*sys.exc_info())
finally:
if b is not None:
b_context.__exit__(*sys.exc_info())
print(result)

这真的很脏,根本不是通用的,并且有潜在的异常处理问题,但它可以工作。

相关内容

  • 没有找到相关文章

最新更新