Python:多线程意义及应用场景
多线程并不是多个线程并发在同一个时间点运行,而是CPU有计划的交替执行多个线程
计算为主的程序 CPU密集型程序
磁盘或网络为主的程序 IO密集型
定义一个线程类:
1.继承Thread
2.重构run方法
from threading import Thread import time class Ourthread(Thread):#定义一个新子类来继承Thread #重构run方法,规定run这个名字,表示线程活动的方法 def run(self): print('duixiang') time.sleep(2) print('???') if __name__=='__main__': #创建线程 i1=Ourthread() i1.start()#启动线程,start会调用run方法
#拓展:start run方法的区别:
start方法是声明分到一个子线程的函数已经就绪,等待被CPU执行
run方法是执行到这个子线程时,自动调用的方法
from threading import Thread import time,threading class Ourthread(Thread):#定义一个新子类来继承Thread #重构run方法,规定run这个名字,表示线程活动的方法 def run(self): print(f'当前线程:{threading.current_thread().name}') if __name__=='__main__': #创建线程实例 t1=Ourthread() t2 = Ourthread() #启动线程 t1.start() t2.start() #run方法启动 t1.run() t2.run()
运行结果为:
当前线程:Thread-1
当前线程:Thread-2
当前线程:MainThread
当前线程:MainThread
线程之间执行是无序的,它是由CPU调度来决定的,CPU调度哪个线程哪个就先执行
import time,threading def task(): time.sleep(1) print(f'当前线程:{threading.current_thread().name}\n',end='') if __name__=='__main__': for i in range(5): #创建线程 t=threading.Thread(target=task) t.start()
输出结果是无序的,在这里展示其中一种:
当前线程:Thread-1 (task)
当前线程:Thread-2 (task)
当前线程:Thread-3 (task)
当前线程:Thread-4 (task)
当前线程:Thread-5 (task)
资源共享:
from threading import Thread import time li=[]#全局变量 #写数据 def writedata(): for i in range(5): li.append(i) time.sleep(0.2) print('writedata:',li) #读数据 def readdata(): print('readdata:',li) if __name__=='__main__': #创建写入数据的线程: wd=Thread(target=writedata) #创建读取数据的线程: rd=Thread(target=readdata) #启动线程 wd.start() wd.join()#阻塞主线程 rd.start() print('hahahah')
资源竞争:
from threading import Thread a=0 b=1000000 def sum1(): for i in range(b): global a #a为整型,修改值时引用地址会改变,需声明 a+=1 print(f'第一次:{a}\n',end='') def sum2(): for i in range(b): global a #a为整型,修改值时引用地址会改变,需声明 a+=1 print(f'第二次:{a}\n',end='') if __name__ == "__main__": # 创建线程 thread = Thread(target=sum1) thread1 = Thread(target=sum2) # 启动线程 thread.start() thread1.start() # 等待线程结束 thread.join() thread1.join()