全局对象在多线程中如何处理?
我想创建一个Pyramid应用程序,并且我正在编写一个ORM(对象关系映射),目前这个ORM还处于早期开发阶段。我希望能够合理地将这个ORM集成到应用中,因此我想了解在多线程环境下,如何处理全局对象。
在这个文件中:https://www.megiforge.pl/p/elephantoplasty/source/tree/0.0.1/src/eplasty/ctx.py,你会看到有一个叫做ctx的全局对象,它包含一个默认的会话。如果我在中间件中运行set_context()和start_session(),在请求进入时会发生什么?我能期待在每个线程中都有一个独立的ctx会话吗?还是说有可能两个线程会使用同一个会话?
1 个回答
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()
。这样可以确保你的上下文不会在不同的线程之间共享。