程序与进程
程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程。
程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行活动,属于动态概念。
进程是资源分配的最小单位,线程是CPU调度的最小单位,每一个进程中至少有一个线程。
线程
线程是进程中执行运算的最小单位,是进程中的一个实体,通常是在一个进程中包括多个线程,每个线程都是作为利用CPU的基本单位。
1、在多线程OS中,线程是能独立运行的基本单位,因而也是独立调度和分派的基本单位
2、同一进程中的各个线程,都可以共享该进程所拥有的资源
3、一个进程中的多个线程之间,可以并发执行
当一个进程启动之后,会默认产生一个主线程,因为线程是程序执行流的最小单元,当设置多线程时,主线程会创建多个子线程,在python中,默认情况下(其实就是setDaemon(False)),主线程执行完自己的任务以后,就退出了,此时子线程会继续执行自己的任务,直到自己的任务结束,
Python3 通过两个标准库 _thread 和 threading 提供对线程的支持。
_thread 提供了低级别的、原始的线程以及一个简单的锁,它相比于 threading 模块的功能还是比较有限的。
threading 模块除了包含 _thread 模块中的所有方法外,还提供的其他方法:
- threading.currentThread(): 返回当前的线程变量。
- threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
- threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。
除了使用方法外,线程模块同样提供了Thread类来处理线程,Thread类提供了以下方法:
- run(): 用以表示线程活动的方法。
- start():启动线程活动。
- join([time]): 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。
- isAlive(): 返回线程是否活动的。
- getName(): 返回线程名。
- setName(): 设置线程名。
- setDaemon():设置为后台线程或前台线程(默认)如果是后台线程,主线程执行过程中,后台线程也在执行,主线程执行完毕后,后台线程不论成功与否,均停止;如果是前台线程,主线程执行过程中,前台线程也在执行,主线程执行完毕后,等待前台线程也执行完成后,程序停止。
#!/usr/bin/env python #coding:utf8 import threading #线程模块 import time def sayhi(num): #定义每个线程要运行的函数 print('running on number',num) time.sleep(3) if __name__ == "__main__": t1 = threading.Thread(target=sayhi,args=(33,)) #生成一个线程实例 t2 = threading.Thread(target=sayhi,args=(22,)) #生成另一个线程实例 t1.start() #启动线程 t2.start() print(t1.getName()) #获取线程名 print(t2.getName()) t1.join() #阻塞主线程,等待t1子线程执行完后再执行后面的代码 t2.join() #阻塞主线程,等待t2子线程执行完后再执行后面的代码 print('-----end')