参考链接: 【莫烦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\测试多线程>