我想用我正在编写的orm创建一个金字塔应用程序(目前处于深度alpha状态)。我想将orm插入应用程序中,因此我想知道如何在多线程中处理全局对象。
在文件中: https://www.megiforge.pl/p/elephantoplasty/source/tree/0.0.1/src/eplasty/ctx.py 你可以看到,有一个名为ctx的全局对象,它包含一个默认会话。如果我在入口的中间件中运行set_context()和start_session()怎么办?我可以期望在每个线程中在ctx中有一个单独的会话吗?或者是否存在两个线程将使用相同会话的风险?
答案 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()
。这将确保您的上下文不会在线程之间共享。