具体来说,在 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/