一、GIL全局解释器锁
python解释器有很多种,最常见的就是Cpython解释器。
GIL的存在是因为CPython解释器的线程的内存管理不是安全的。GIL本质也是一把互斥锁,将并发变成串行牺牲效率保证数据的安全,用来阻止同一个进程下的多个线程的同时执行(同一个进程内多个线程无法实现并行但是可以实现并发)。
每个线程的运行是需要解释器将程序解释称计算机能读懂的语言,每个进程中都有一个解释器,若没有GIL,每个线程都能同时拿到解释器,并对同一个数据进行处理,例如每个线程(没有阻塞的线程)将拿到的数据减一,如果原数据是100,100个线程都减一应得到的结果是0,但实际上得到的是99,此时就会表现出数据的处理是不安全的。
1 from threading import Thread 2 import time 3 4 n = 100 5 6 7 def task(): 8 global n 9 tmp = n 10 n = tmp - 1 11 12 13 t_list = [] 14 for i in range(100): 15 t = Thread(target=task) 16 t.start() 17 t_list.append(t) 18 19 for t in t_list: 20 t.join() 21 22 print(n) # 0
当线程遇到阻塞的时候,会自动释放全局解释器锁,其它的线程就会抢到该锁。(time.sleep(1))在每个线程阻塞的过程中,每个线程拿到数据可能时一样的。当阻塞结束后,每个线程对想通的数据做相同的操作时,最终得到的结果可能与预期不同对可能发生抢数据的行为应对该数据加锁。
from threading import Thread import time n = 100 def task(): global n tmp = n time.sleep(1) n = tmp - 1 t_list = [] for i in range(100): t = Thread(target=task) t.start() t_list.append(t) for t in t_list: t.join() print(n) # 99
垃圾回收机制
1.引用计数
2.标记清除
3.分代回收
---恢复内容结束---