在线程中如何处理全局对象



我想创建一个金字塔应用程序的形式,我正在写(目前在深alpha状态)。我想把表单理智地插入到应用程序中,因此我想知道全局对象是如何在多线程中处理的。

在文件中:https://www.megiforge.pl/p/elephantoplasty/source/tree/0.0.1/src/eplasty/ctx.py您可以看到,有一个名为CTX的全局对象,它包含一个默认会话。如果我运行set_context()和start_session()在中间件的入口?我能期望在每个线程中都有一个单独的会话吗?或者是否存在两个线程使用同一个会话的风险?

全局变量在所有线程之间共享,因此如果运行这些函数,线程之间将以不可预测的方式发生冲突。

你可以使用线程本地数据,使用threading.local。您需要删除ctx的全局定义,然后创建以下函数:

def get_ctx():
    thread_data = threading.local()
    if not hasattr(thread_data, "ctx"):
         thread_data.ctx = Ctx()
    return thread_data.ctx

然后,在引用ctx的地方调用get_ctx()。这将确保上下文不会在线程之间共享。

相关内容

  • 没有找到相关文章

最新更新