threading.local是否使用锁进行访问?

时间:2017-07-26 00:03:06

标签: python multithreading python-multithreading

以下陈述中是否有Lock.acquire/release幕后的内容:

my_thread_local = threading.local()
my_thread_local.some_value = 1

这个怎么样:

local_variable = my_thread_local.some_value

1 个答案:

答案 0 :(得分:5)

仅在使用后备实施时。

如果未提供线程局部存储(即,如果在编译解释器时未定义Py_HAVE_NATIVE_TLS),则将使用涉及显式锁定的实现。

在具有适当本机实现的平台上,因此不需要Python运行时来模拟此功能,因此无需在Python运行时层锁定。

撰写本文时(2017年7月),来自Python 3开发分支的后备实现was recently removed(不再 任何针对BeOS或其他模糊操作系统的线程模块以前得到支持)。因此,在Python 3的未来版本中,当线程可用时,线程本地存储的本机版本将始终

流程图:

  • 你是Python 2.x吗?
    • 你在Windows上吗? 可以使用本机线程本地存储。
    • 您是否在任何非Windows平台上? Python正在使用基于锁定的实现。
  • 您使用的是Python 3.1或更高版本吗?
    • 你在Windows上吗? 可以使用本机线程本地存储。
    • 您是在现代Linux,MacOS或其他实现POSIX线程的平台上吗? 可以使用本机线程本地存储。
    • 您是否在不支持pthreads API的非Windows平台上? 您要么根本没有线程支持,要么线程本地存储将涉及锁定。

(这里有意没有涉及Python 3.0:2.7和3.1及更高版本中存在的本机线程本地存储实现在3.0中不存在于代码中的相同位置,它们在其他地方托管版本,我不认为值得我花时间去挖掘以确定功能是否暂时移动,或者它是否完全缺失了。