线程中如何处理全局对象?
我想用我正在编写的 orm 创建一个 Pyramid 应用程序(目前处于深度 alpha 状态)。我想将 orm 正确地插入应用程序,因此我想知道如何在多线程中处理全局对象。
在文件中: https://www.megiforge.pl /p/elephantoplasty/source/tree/0.0.1/src/eplasty/ctx.py 你可以看到,有一个名为 ctx 的全局对象,其中包含一个默认会话。如果我在入口处的中间件中运行 set_context() 和 start_session() 会怎样?我可以期望每个线程中的 ctx 都有一个单独的会话吗?或者是否存在两个线程使用同一个会话的风险?
I would like to create a Pyramid app with an orm which I am writing (currently in deep alpha status). I want to plug the orm into the app sanely and thus I want to know how global objects are handled in multithreading.
In the file:
https://www.megiforge.pl/p/elephantoplasty/source/tree/0.0.1/src/eplasty/ctx.py
you can see, there is a global object called ctx which contains a default session. What if I run set_context() and start_session() in middleware at ingress? Can I expect then to have a separate session in ctx in every thread? Or is there a risk that two threads will use the same session?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
全局变量在所有线程之间共享,因此如果运行这些函数,线程将以不可预测的方式相互冲突。
要执行您想要的操作,您可以使用线程本地数据,使用 threading.local。您需要删除 ctx 的全局定义,然后创建以下函数。
然后,在任何引用
ctx
的地方都调用get_ctx()
。这将确保您的上下文不会在线程之间共享。Global variables are shared between all threads, so if you run those functions the threads will conflict with each other in unpredictable ways.
To do what you want you can use thread local data, using threading.local. You need to remove the global definition of
ctx
and then create the following function.Then, everywhere you reference
ctx
callget_ctx()
instead. This will ensure that your context is not shared between threads.