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

时间:2011-10-11 08:35:12

标签: python multithreading orm global-variables pyramid

我想用我正在编写的orm创建一个金字塔应用程序(目前处于深度alpha状态)。我想将orm插入应用程序中,因此我想知道如何在多线程中处理全局对象。

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

1 个答案:

答案 0 :(得分:2)

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

要执行您想要的操作,您可以使用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()。这将确保您的上下文不会在线程之间共享。