当前位置: 主页 > Python语言

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秒!