cpython 解释器中存在一个GIL(全局解释器锁),无论多少个线程、多少颗cpu
他的作用就是保证同一时刻只有一个线程可以执行代码,因此造成了我们使用多线程的时候无法实现并行。
因为有GIL的存在、所以同一时刻只能有一个线程被CPU执行
任务:IO 密集型:可以采用多线程(多进程+协成)
计算密集型:python不适用
(1)IO 密集型、CPU会是实现自动切换 提高工作效率
def ListenMusic(name): print("beging listening to %s,%s" %(name,time.ctime())) time.sleep(5) print("end listening %s" % time.ctime()) def Recordlog(name): print("beging recoding to %s,%s" %(name,time.ctime())) time.sleep(5) print("end recoding %s" % time.ctime()) if __name__ == '__main__': threads=[] t1=threading.Thread(target=ListenMusic,args=("凤凰传奇",)) t2=threading.Thread(target=Recordlog,args=("python多线程",)) threads.append(t1) threads.append(t2) for t in threads: t.start()
(2) 计算密集型 cpu 一直处于工作状态、没有io流的切换、不适用多进程
import threading,time def add(): s=0 for i in range(100000990): s +=i print("累加的结果是:",s) def mul(): s1=1 for i in range(1,10000): s1 *= i print("累乘的结果是:",s1) if __name__ == '__main__': start= time.time() L = [] t1=threading.Thread(target=add) t2=threading.Thread(target=mul) L.append(t1) L.append(t2) for t in L: t.start() for t in L: t.join() print("总共花费时间",time.time()-start)