我正在消耗一个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)是否有方法同时使用线程调用这两个contextmanagers以加快加载时间?
发布于 2022-05-18 22:56:02
在做了更多的研究之后,我找到了一个解决方案,但这可能不是最好的答案。该解决方案依赖于为contextmanager手动调用__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)这是非常脏的,一点都不通用,而且异常处理可能会出现问题,但它是有效的。
https://stackoverflow.com/questions/72296425
复制相似问题