深圳营销网站建设策划百度最怕哪个投诉电话
多线程并不是多个线程并发在同一个时间点运行,而是CPU有计划的交替执行多个线程
计算为主的程序 CPU密集型程序
磁盘或网络为主的程序 IO密集型
定义一个线程类:
1.继承Thread
2.重构run方法
from threading import Thread import timeclass 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,threadingclass 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,threadingdef 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 timeli=[]#全局变量 #写数据 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=1000000def sum1():for i in range(b):global a #a为整型,修改值时引用地址会改变,需声明a+=1print(f'第一次:{a}\n',end='')def sum2():for i in range(b):global a #a为整型,修改值时引用地址会改变,需声明a+=1print(f'第二次:{a}\n',end='')if __name__ == "__main__":# 创建线程thread = Thread(target=sum1)thread1 = Thread(target=sum2)# 启动线程thread.start()thread1.start()# 等待线程结束thread.join()thread1.join()