我想创建一个金字塔应用程序的形式,我正在写(目前在深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()
。这将确保上下文不会在线程之间共享。