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

Python 线程中如何处理全局对象?,python,multithreading,orm,global-variables,pyramid,Python,Multithreading,Orm,Global Variables,Pyramid,我想用我正在编写的orm(目前处于deep alpha状态)创建一个金字塔应用程序。我想将orm正确地插入应用程序,因此我想知道在多线程中如何处理全局对象 在文件中: 您可以看到,有一个名为ctx的全局对象,它包含一个默认会话。如果我在ingress的中间件中运行set_context()并启动_session(),会怎么样?我可以期望在每个线程中都有一个单独的ctx会话吗?或者是否存在两个线程使用同一会话的风险?全局变量在所有线程之间共享,因此如果运行这些函数,线程将以不可预测的方式相互冲突

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

在文件中:
您可以看到,有一个名为ctx的全局对象,它包含一个默认会话。如果我在ingress的中间件中运行set_context()并启动_session(),会怎么样?我可以期望在每个线程中都有一个单独的ctx会话吗?或者是否存在两个线程使用同一会话的风险?

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

要执行所需操作,可以使用线程本地数据,使用。您需要删除ctx的全局定义,然后创建以下函数

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

然后,无论您在哪里引用
ctx
call
get\u ctx()
。这将确保线程之间不会共享您的上下文。

对于这个问题的后代来说,如果您可以将代码粘贴到您的问题中,而不是链接到您的“主”分支,那将是一件好事,因为当有人来阅读它时,这个分支很可能会发生变化。@MichaelMerickel-您是对的-这不是一个好主意。但我仍然认为,完整的图片提供了更好的视角。所以我编辑了我的帖子并链接到标签,而不是主分支。你的方法行不通。每次调用get_ctx()都会返回一个新对象。但你给了我一个好方法。我所做的是从threading.local派生我的Ctx类。这样它就能按预期的方式工作。因此,我接受你的回答,认为这是一个很好的观点。