python - Python 中的 "thread local storage"是什么,我为什么需要它?

标签 python multithreading thread-local

具体来说,在 Python 中,变量如何在线程之间共享?

虽然我之前使用过 threading.Thread,但我从未真正理解或看到变量如何共享的示例。它们是在主线程和子线程之间共享还是仅在子线程之间共享?我什么时候需要使用线程本地存储来避免这种共享?

我看到了很多关于使用锁在线程之间同步访问共享数据的警告,但我还没有看到一个很好的问题示例。

提前致谢!

最佳答案

在 Python 中,所有东西都是共享的,除了函数局部变量(因为每个函数调用都有自己的一组局部变量,并且线程总是单独的函数调用。)即使那样,只有变量本身(引用的名称to objects) 是函数的局部变量;对象本身总是全局的,任何东西都可以引用它们。 特定线程的 Thread 对象在这方面不是特殊对象。如果您将 Thread 对象存储在所有线程都可以访问的位置(如全局变量),那么所有线程都可以访问那个 Thread 对象。如果你想原子地修改另一个线程可以访问的任何东西,你必须用锁来保护它。当然,所有线程都必须共享这个相同的锁,否则它不会很有效。

如果你想要实际的线程本地存储,那就是 threading.local 的用武之地。 threading.local 的属性在线程之间不共享;每个线程只看到它自己放置在那里的属性。如果你对它的实现感到好奇,源代码在 _threading_local.py在标准库中。

关于python - Python 中的 "thread local storage"是什么,我为什么需要它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/104983/

相关文章:

python - 使用 session.query 读取 SQLAlchemy 中未提交的数据

java - ThreadLocal 的使用如何降低可重用性

java - 这里ThreadLocal的目的是什么?

java - 使用 ThreadLocal 的最佳方法是什么 - 通过静态或非静态方法?

c# - Outlook 插件部署线程

python - 了解 PyTorch 中的累积梯度

python - as_strided : Linking stepsize (strides of conv2d) with as_strided strides parameter

python - 通过 Python API 创建 Bigquery 表

multithreading - Jenkins一次运行多个批处理文件

Java Swing : do I need two threads?