GIL全局解释器锁:
在Cpython 解释器中,同一个进程下开启的多线程,同一时刻只能有一个线程执行,无法利用多核优势。
所有的python代码都是交给解释器解释的,在同一进程中的多个线程以及解释器自带的垃圾回收线程是共享解释器资源的,共享就意味着竞争,竞争就会出现问题,比如说python线程想要执行一个一段代码,垃圾回收线程又想回收这段代码,这样就会出现错误。这时候必须有一种机制,保证数据安全,就是将这种并发的状态改为串行的状态。这种机制就是加锁处理,保证解释器同一时间只能执行一个任务的代码。
但是GIL只是保护解释器级别的数据安全,保护自己的数据还是需要自己加锁处理。
有了GIL锁,同一时刻同一进程中只有一个线程被执行!
计算密集型:多线程效率高
from threading import Thread from multiprocessing import Process import time def work(): j = 0 for i in range(10000000): j+= i if __name__ == '__main__': L = [] s = time.time() for i in range(4): # t = Thread(target = work)#10秒左右 t = Process(target = work)#7秒左右 L.append(t) t.start() for t in L : t.join() stop = time.time() print("主 run time :%s"%(stop-s))
I/O密集型:多线程效率高
from multiprocessing import Process from threading import Thread def work(): time.sleep(10) if __name__ == '__main__': l = [] start = time.time() for i in range(4): t = Thread(target = work)#主 run time:10.007068872451782 # t = Process(target = work)#主 run time:12.057122707366943 l.append(t) t.start() for t in l: t.join() stop = time.time() print("主 run time:%s"%(stop- start))
同步锁:
GIL锁是保护解释器级别的数据安全,那么程序自身的数据安全呢,这个时候就会用到同步锁。ps:同步锁就是互斥锁。锁通常是保护共享数据的安全性,当你需要访问该资源时,调用acquire方法来获取对象(如果其它线程已经获得该锁,则当前线程需要等待其释放)待资源访问完后,再调用release方法释放锁。
死锁与递归锁:
所谓死锁:是指两个或者两个以上的进程或线程在执行程序过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,会一直持续这种等待状态,这样的现象就是死锁。
from threading import Thread,RLock,Lock import time mutexA = Lock() mutexB = Lock() class Mythread(Thread): def run(self): self.f1() self.f2() def f1(self): mutexA.acquire() print("