Python里的多线程是假的多线程,不管有多少核,同一时间只能在一个核中进行操作!
利用Python的多线程,只是利用CPU上下文切换的优势,看上去像是并发,其实只是单线程。
import threading
import time
def test1():
for i in range(10000000):
a = 100 - i
def 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.5700154304504395
test1()
print('单线程两次:', time.time() - t1) # 单线程两次: 1.1943449974060059
test1()
print('单线程三次:', time.time() - t1) # 单线程三次: 1.8057115077972412
test1()
print('单线程四次:', time.time() - t1) # 单线程四次: 2.410094738006592
t2 = 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 threading
import time
def 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 threading
import time
def 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)
作用:主线程一直等待全部的子线程结束之后,主线程自身才结束,程序退出。