python多线程模块threading学习笔记(4)之全局解释器锁GIL

参考链接: 【莫烦Python】Threading 学会多线程 Python
参考链接: 莫烦 多线程
参考链接: threading — 基于线程的并行
参考链接: queue — 一个同步的队列类
参考链接: 12.9 Python的全局锁问题

【总结】
由于全局解释器锁(GIL)的存在,对于CPU计算密集型任务,
多线程并不会加快程序执行,因为GIL保证程序执行的每个时间点,
只有一个线程在运行,这导致无法利用多CPU或者多核,所节省下的时间主要是IO时间.

【阅读参考: python3-cookbook 12.9 Python的全局锁问题】
    尽管Python完全支持多线程编程, 但是解释器的C语言实现部分在完全并行执行时并不是线程安全的。 
    实际上,解释器被一个全局解释器锁保护着,它确保任何时候都只有一个Python线程执行。
    GIL最大的问题就是Python的多线程程序并不能利用多核CPU的优势 (比如一个
    使用了多个线程的计算密集型程序只会在一个单CPU上面运行)。
    在讨论普通的GIL之前,有一点要强调的是GIL只会影响到那些严重依赖CPU的程序(比如计算型的)。
    如果你的程序大部分只会涉及到I/O,比如网络交互,那么使用多线程就很合适, 因为它们大部分时间都在等待。
    实际上,你完全可以放心的创建几千个Python线程, 现代操作系统运行这么多线程没有任何压力,没啥可担心的。

	 ---- 【莫烦Python】Threading 学会多线程 Python

testThreading5_1.py

# 教学视频第5集
import threading
from queue import Queue
import copy
import time

def job(l, q):
    res = sum(l)
    q.put(res)

def multithreading(l):
    q = Queue()
    threads = []
    for i in range(4):
        t = threading.Thread(target=job, args=(copy.copy(l), q), name='T%i' % i)
        t.start()
        threads.append(t)
    [t.join() for t in threads]
    total = 0
    for _ in range(4):
        total += q.get()
    print(total)

def normal(l):
    total = sum(l)
    print(total)

if __name__ == '__main__':
    l = list(range(1000000))
    s_t = time.time()
    normal(l*4)
    print('normal: ',time.time()-s_t)
    s_t = time.time()
    multithreading(l)
    print('multithreading: ', time.time()-s_t)

控制台输出结果展示:

版权所有 (C) Microsoft Corporation。保留所有权利。

尝试新的跨平台 PowerShell https://aka.ms/pscore6

加载个人及系统配置文件用了 928 毫秒。
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多线程>  & 'D:\Python\Python37\python.exe' 'c:\Users\chenxuqi\.vscode\extensions\ms-python.python-2021.1.502429796\pythonFiles\lib\python\debugpy\launcher' '59444' '--' 'c:\Users\chenxuqi\Desktop\News4cxq\测试多线程\testThreading5_1.py'
1999998000000
normal:  0.16456007957458496
1999998000000
multithreading:  0.15584421157836914
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多线程>

你可能感兴趣的:(莫烦Python,多线程学习笔记,Python基础实验)