Python里的多线程是假的多线程,不管有多少核,同一时间只能在一个核中进行操作!
利用Python的多线程,只是利用CPU上下文切换的优势,看上去像是并发,其实只是单线程。
import threadingimport timedef test1():for i in range(10000000):a = 100 - idef test2():threads = []t1 = threading.Thread(target=test1) #创建一个线程,target代表要指定执行什么t2 = threading.Thread(target=test1)t3 = threading.Thread(target=test1)t4 = threading.Thread(target=test1)threads.append(t1) #把线程放到list里面threads.append(t2)threads.append(t3)threads.append(t4)threads[0].start() #启动这个线程threads[1].start()threads[2].start()threads[3].start()threads[0].join() #主线程等待子线程threads[1].join()threads[2].join()threads[3].join()if __name__ == '__main__':t1 = time.time()test1()print('单线程一次:', time.time() - t1) # 单线程一次: 0.5700154304504395test1()print('单线程两次:', time.time() - t1) # 单线程两次: 1.1943449974060059test1()print('单线程三次:', time.time() - t1) # 单线程三次: 1.8057115077972412test1()print('单线程四次:', time.time() - t1) # 单线程四次: 2.410094738006592t2 = time.time()test2()print('多线程四次:', time.time() - t2) # 多线程四次: 2.4066476821899414
多线程执行时间 约等于 单线程执行时间,可见多线程并没有提高效率。
多线程执行的本质就是 各线程交替轮番执行,和谐的随机在单核上执行。
多线程有什么用?
解决I/O阻塞问题和I/O占用时CPU闲置问题。
I/O操作不占用CPU ,计算操作占CPU。
举例:
接口A处理需要花费10s接口B处理需要花费5s接口C处理需要花费2s
三个用户(几乎同时):小红请求A接口,小明请求B接口,小张请求C接口
单线程下:小红10s收到结果,小明15s收到结果,小张17s收到结果多线程下:小红13s收到结果,小明7s收到结果,小张3s收到结果
Python应用多线程的根本目的:使程序交替轮番执行,不会对后边的程序产生阻塞。
注意:多线程提升不了CPU的处理效率,只能提供调用CPU的方案
所以如果运行瓶颈不在CPU运算而在I/O上,多线程显然很划算。
拓展:Python多线程中 join() 的用法
import threadingimport timedef run():time.sleep(2)print('当前线程的名字是: ', threading.current_thread().name)time.sleep(2)if __name__ == '__main__':start_time = time.time()print('这是主线程:', threading.current_thread().name)thread_list = []for i in range(5):t = threading.Thread(target=run)thread_list.append(t)for t in thread_list:t.start()print('主线程结束了!' , threading.current_thread().name)print('一共用时:', time.time()-start_time)
join的作用:
import threadingimport timedef run():time.sleep(2)print('当前线程的名字是: ', threading.current_thread().name)time.sleep(2)if __name__ == '__main__':start_time = time.time()print('这是主线程:', threading.current_thread().name)thread_list = []for i in range(5):t = threading.Thread(target=run)thread_list.append(t)for t in thread_list:t.setDaemon(True)t.start()for t in thread_list:t.join()print('主线程结束了!' , threading.current_thread().name)print('一共用时:', time.time()-start_time)
作用:主线程一直等待全部的子线程结束之后,主线程自身才结束,程序退出。
参考:python是单线程的,多线程有意义么_fangxiananvhai的博客-CSDN博客_python为什么是单线程
Python多线程与多线程中join()的用法 - cnkai - 博客园