近期看了一些关于GIL的一些内容,敲一下代码看看效果。

# coding:utf-8
# GIL(Global Interpreter Lock):他只允许任何时刻只有一个线程处于执行状态,即使是在具有多个CPU内核的多线程架构中。
# 为什么没有删除GIL,因为现在的python已经严重依赖GIL提供的解决方案。如果删除会破坏现有的C扩展。(free threading 就是删除的案例,他会导致单线程任务速度降低40%。)
# 释放GIL:以前版本是采用计数策略删除,如果该线程计数为0,则删除。现在采用固定时间间隔,到了时间点就删除。
import time
from threading import Thread
from multiprocessing import Pool
Count = 50000000
def countdown(n):
    while n>0:
         n-=1
if __name__ == "__main__":
    # 不采用多进程和多线程
    start1 = time.time()
    countdown(Count)
    end1 = time.time()
    print("2:", end1 - start1)  # 2.538

    # 采用多线程
    # t1 = Thread(target=countdown, args=(Count // 2,))
    # t2 = Thread(target=countdown, args=(Count // 2,))
    # start = time.time()
    # t1.start()
    # t2.start()
    # t1.join()  # join 所完成的工作就是线程同步,即主线程任务结束以后,进入堵塞状态,一直等待所有的子线程结束以后,主线程再终止
    # t2.join()  # 至于为什么,我觉得可能是为了防止同一时刻有多个线程访问资源。
    # end = time.time()
    # print("1:", end - start)  # 2.717

    # 采用多进程
    # pool = Pool(processes=2)
    # start2 = time.time()
    # r1 = pool.apply_async(countdown, [Count//2])
    # r2 = pool.apply_async(countdown, [Count//2])
    # pool.close()
    # pool.join()
    # end2 = time.time()
    # print("3:",end2-start2)  # 1.617

结果发现,采用多进程的确会好点。