1.操作系统历史
1.1 无操作系统
单个程序运行需要经历输入、运算、输出等过程,多个程序运行时较为繁琐,计算机利用率低
1.2 批处理系统
多个程序列为一个清单统一进行运行。 单一程序运行结束后要等到所有程序运行完才能得到结果
1.3多道程序设计
某一程序遇到io阻塞时,自动切换到另一程序,提高计算机的运行效率。
1.4 个人计算机
随着硬件的发展,个人计算机出现,不必在再和其他人分享计算机。此时用户之间的矛盾已经解决
2.程序之间的矛盾
2.1 进程
进程是指某个程序的运行过程(抽象的概念),包括程序、程序所需的资源以及进程控制块
2.1.1 进程出现的原因
可以在同一时间做多件事,不同进程之间的资源不共享。
2.2 线程
线程可以看做是个小型的进程,因为进程在进行切换时,数据的交换很繁琐,耗费资源,
线程在进程之中,进程中的线程可以共享进程的资源,这样不同线程进行切换时耗费资源小。
2.3 进程与线程
一个进程可以有多个线程,最起码有一个线程。
进程是资源分配的最小单位,线程是最小的执行单位。
3.程序的切换
- IO阻塞
- 以时间为单位自动切换(毫秒级别)
当进程需要以上两条时,会自动切换进程,线程同理。
4.线程的调用 threading模块
线程一般是调用函数
import threading#导入线程模块 import time def Hi(num): print('hello %s' %num) time.sleep(3) #线程的接口 t1=threading.Thread(target=Hi,args=(10,))#是个类,实例化,target是这个线程执行的名字,args是参数 t1.start() t2=threading.Thread(target=Hi,args=(4,))#是个类,实例化,target是这个线程执行的名字,args是参数 t2.start() print('aaa')#输出结果是没有等三秒,直接出来了,属于主线程
此时,一共有三个线程,主线程,t1,t2。这三个线程是同时运行的,虽然主线程已经运行完毕,但是需要在子线程运行完之后再关闭。
4.1 join方法
提高某个子线程的优先级,在这个子线程运行完之后再运行其他线程,如果再次之前其他线程已运行,则同时运行
import threading#导入线程模块 import time def Hi(): print('hi',time.ctime()) time.sleep(3) print('this is hi end',time.ctime()) def hello(): print('this is hello',time.ctime()) time.sleep(5) print('this is hello end',time.ctime()) #线程的接口 t1=threading.Thread(target=Hi,)#是个类,实例化,target是这个线程执行的名字,args是参数 t2=threading.Thread(target=hello)#是个类,实例化,target是这个线程执行的名字,args是参数 t1.start() t1.join() t2.start() print('aaa')#输出结果是没有等三秒,直接出来了,属于主线程
结果:
hi Wed Jul 25 22:22:32 2018#此时t1线程开启 this is hi end Wed Jul 25 22:22:35 2018#t1线程优先级高,优先结束 this is hello Wed Jul 25 22:22:35 2018#t2进程开启 aaa#主线程执行结束 this is hello end Wed Jul 25 22:22:40 2018#t2线程结束
其他:
import threading#导入线程模块 import time def Hi(): print('hi',time.ctime()) time.sleep(3) print('this is hi end',time.ctime()) def hello(): print('this is hello',time.ctime()) time.sleep(5) print('this is hello end',time.ctime()) #线程的接口 t1=threading.Thread(target=Hi,)#是个类,实例化,target是这个线程执行的名字,args是参数 t2=threading.Thread(target=hello)#是个类,实例化,target是这个线程执行的名字,args是参数 t1.start() t2.start() t1.join() print('aaa')#输出结果是没有等三秒,直接出来了,属于主线程
hi Wed Jul 25 22:24:15 2018 this is hello Wed Jul 25 22:24:15 2018 this is hi end Wed Jul 25 22:24:18 2018 aaa#t1线程优先执行完,再执行主线程 this is hello end Wed Jul 25 22:24:20 2018
4.2 setDaemon(True)方法==守护程序,
若主线程执行完毕,则不必等待这个线程,此子线程和主线程同时关闭
import threading#导入线程模块 import time def Hi(): print('hi',time.ctime()) time.sleep(3) print('this is hi end',time.ctime()) def hello(): print('this is hello',time.ctime()) time.sleep(5) print('this is hello end',time.ctime()) #线程的接口 t1=threading.Thread(target=Hi,)#是个类,实例化,target是这个线程执行的名字,args是参数 t2=threading.Thread(target=hello)#是个类,实例化,target是这个线程执行的名字,args是参数 t1.start() t2.setDaemon(True)#t2作为守护线程,将会在T1执行完之后,不必等待自己的五秒钟,直接在主线程执行完之后结束线程 t2.start() print('aaa')#输出结果是没有等三秒,直接出来了,属于主线程
hi Wed Jul 25 22:27:06 2018 this is hello Wed Jul 25 22:27:06 2018aaa this is hi end Wed Jul 25 22:27:09 2018
5.join和setDaemon都是线程实例的方法