首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用线程加速上下文管理器的缓慢初始化

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

Stack Overflow用户
提问于 2022-05-18 21:53:59
回答 1查看 56关注 0票数 0

我正在消耗一个python2.7模块,我很难改变这个模块。该模块为作为上下文管理器的类提供了一个工厂。这对于管理对象的生存期非常有用,但是初始化这个类需要等待创建一个基于云的资源,运行它可能需要很多分钟。在我的程序范围内,我需要创建两个对象,如下所示:

代码语言:javascript
复制
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以加快加载时间?

EN

回答 1

Stack Overflow用户

发布于 2022-05-18 22:56:02

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

代码语言:javascript
复制
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)

这是非常脏的,一点都不通用,而且异常处理可能会出现问题,但它是有效的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72296425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档