众所周知,Python由于历史遗留的GIL问题,不借助特殊的手段,是无法在多核上运行的。
于是写了一段多线程跑死循环,想验证一下:
import threading, multiprocessing
def loop():
x = 0
while True:
x ^= 1
print(x)
for i in range(multiprocessing.cpu_count()):
t = threading.Thread(target=loop)
t.start()
这一验证验证出问题了,通过性能监视发现,轻轻松松跑满了8个逻辑核。如下图
此时运行环境是Win 11,Python 3.10。然后我又换到WSL环境测试,Kali-Linux,Python 3.9.7,得到了一样的结论。。
是哪里出了问题?
由于存在全局解释器锁,同一时刻只有一个线程可以执
行 Python 代码(虽然某些性能导向的库可能会去除此限制)。如果你想让你的应用更好地利用多核心计算
机的计算资源,推荐你使用multiprocessing 或concurrent.futures.ProcessPoolExecutor。
但是,如果你想要同时运行多个 I/O 密集型任务,则多线程仍然是一个合适的模型。