class 来自导入模块线程的变量初始化在 Python 中是否安全?

Is class variable initialization from an imported module thread safe in Python?

我知道 class 变量初始化发生在导入时。如果是这样,在下面的代码中,class A 的 class 变量初始化是否会导致竞争条件?

a.py:

class A:
    # Static code here...
    pass

b.py:

class B:
    def func(self):
        from a import A

c.py:

import threading
from b import B

b1 = B()
b2 = B()

t1 = threading.Thread(target=b1.func)
t2 = threading.Thread(target=b2.func)

t1.start()
t2.start()

t1.join()
t2.join()

航站楼:

$ python c.py

由于 Global Interpreter Lock,我相信这里没有数据竞争(假设您使用的是 CPython 或类似的实现)。在任何给定时间,只有一个线程可以执行 Python 字节码。

然而,两个线程中的哪一个实际上最终首先导入A不能(或至少不应该)依赖。

在 importlib 的 CPython 实现中,C 端有一个线程锁,但为了确定,我 运行 以下脚本:

导入的文件:

import time
print('importing, in imported file')
time.sleep(2) # drop the GIL
print('finished importing, in imported file')

正在导入文件:

import threading

def import_other_file():
    print('going to import')
    import ex12
    print('finished importing')

t1 = threading.Thread(target=import_other_file)
t2 = threading.Thread(target=import_other_file)

t1.start()
t2.start()

t1.join()
t2.join()

输出:

going to import
going to import
importing, in imported file
finished importing, in imported file
finished importing
finished importing

does the class variable initialization of class A result in race conditions?

所以NO,不会因为C端的锁而出现race condition