python 多线程并发锁-c 线程池并发
发布时间:2023-02-09 11:36 浏览次数:次 作者:佚名
场景描述
最近在做实验的时候,想到了用多线程来加速数据集的加载。 试了之后,总觉得时间还是很慢,于是查了下资料,发现:python多线程是一个sinkhole!
Python 中的多线程是伪多线程! 因为 Cpython 解释器有一个叫做全局解释器锁(GIL)的东西。 解释器在解释执行Python代码时python 多线程并发锁python 多线程并发锁,首先要获得锁,也就是说任何时候只有一个线程可以执行代码。 其他线程要想获得CPU执行代码指令,必须先获得锁。 如果锁被其他线程占用,那么线程只能等到拥有锁的线程释放锁后才能执行代码指令。 所以python多线程其实就相当于单线程,很多时间浪费在切换线程上!
测试
运行以下函数testadd()10次,分别使用单线程、多线程、多进程
import time
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
def testadd():
s = 0
for i in range(int(1e7)):
s += i
s /= 2
return s
if __name__ == '__main__':
time1 = time.perf_counter()
for i in range(10):
testadd()
time2 = time.perf_counter()
print(f'{time2 - time1:.2f}')
pool = ThreadPoolExecutor(max_workers=8)
tasks = [pool.submit(testadd) for i in range(10)]
for t in tasks:
t.result()
time3 = time.perf_counter()
print(f'{time3 - time2:.2f}')
pool = ProcessPoolExecutor(max_workers=8)
tasks = [pool.submit(testadd) for i in range(10)]
for t in tasks:
t.result()
time4 = time.perf_counter()
print(f'{time4 - time3:.2f}')
运行结果:
6.33
17.38
1.06
可以看到单线程需要6秒的时候,多线程需要17秒! 将近3倍的时间! 而且多进程时间仅为1秒!