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

发布于 2024-12-09 02:28:30 字数 431 浏览 0 评论 0原文

我想用我正在编写的 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

小兔几 2024-12-16 02:28:30

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

要执行您想要的操作,您可以使用线程本地数据,使用 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() 。这将确保您的上下文不会在线程之间共享。

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.

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

Then, everywhere you reference ctx call get_ctx() instead. This will ensure that your context is not shared between threads.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文