进程与线程
进程:一个程序在一个数据集上的一次动态执行过程,是最小的资源单位
要以一个整体形式暴露给操作系统,里面包含对各种资源的调用,内存对各种资源管理的集合
线程:是操作系统的最小执行单位,是一串指令的集合,最接近执行体
进程与线程的区别
一个程序至少有一个进程,一个进程至少有一个线程(进程可以理解为线程的容器)
进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的执行效率
线程不能独立存在,必须依存在应用程序中,由应用程序提供多个线程执行控制
一个线程可以创建和撤销另一线程,同一进程中的多个线程之间可以并发执行
简单的多线程创建
下面这个代码是生成了两个子线程对象,执行程序打印完test1t1和testt2,之后总共只用等待大约两秒
比起以前执行两个函数要少花费一半时间
import threading
import time
def run(n):
print("test1",n)
time.sleep(2)
t1=threading.Thread(target=run,args=("t1",))
t2=threading.Thread(target=run,args=("t2",))
t1.start()
t2.start()
继承式多线程创建
继承式是调用的另一种方式
import threading,time
class MyThread(threading.Thread):
def __init__(self,n):
super(MyThread,self).__init__()
self.n=n
def run(self):
print("running task",self.n)
t1=MyThread("t1")
t2=MyThread("t2")
t1.start()
t2.start()
阻塞线程 join()
import threading
import time
def music():
print("begin music",time.ctime())
time.sleep(3)
print("end music",time.ctime())
def game():
print("begin game",time.ctime())
time.sleep(5)
print("end game",time.ctime())
if __name__=="__main__":
t1=threading.Thread(target=music)
t2=threading.Thread(target=game)
t1.start()
t1.join()
t2.start()
#t2.join()
print("ending.....")
仔细看t1.join()的位置
执行结果:
好好看看上边结果的秒数!
那如果想要子线程都执行完再执行主线程怎么办呢,那就创建列表,把子线程对象存进去,for循环start(),再for循环join(),如下!
import threading,time
class MyThread(threading.Thread):
def __init__(self,n):
super(MyThread,self).__init__()
self.n=n
def run(self):
print("running task",self.n)
ti