Python3之并发(一)---threading模块基础
一、线程与进程,并发与并行
一) 并发与并行
1 并发
同一时刻只能有执行一个任务,但多个任务间快速交替轮换执行,使得宏观上具有多个任务同时执行的效果
不同代码块交替执行
2 并行
同一时刻执行多个任务
不同代码块同时执行
二) 线程与进程
1 进程
进程是系统进行资源分配和调度的基本单位,是操作系统结构的基础
特征
独立性: 进程是系统中独立存在的实体,拥有属于进程本身的独立资源
动态性: 进程具有自己的生命周期和各种不同的状态
并发性: 多个进程可以在单个处理器上并发执行,且进程间互不影响
2 线程
线程是CPU调度的基本单元,线程是进程的组成部分
一个进程可以有多个线程,且多个线程共享进程里的所有资源,一个进程至少包括一个主线程
一个线程必须有一个父进程
同一进程的多个线程可以并发执行
进程结束后它拥有的所有线程都将销毁,而线程的结束不会影响同一进程中的其他线程的结束
二、threading 模块
Python 提供了 _thread 和 threading 两个模块来支持多线程,其中 _thread 模块提供低级别的线程支持,一般不建议使用, threading 提供了功能丰富的多线程支持
该模块常用的一些方法、属性
threading.active_count() 返回当前还活动的Thread对象的数量,返回的数量等于 threading.enumerate() 返回的列表的长度 threading.current_thread() 返回当前Thread对象 threading.enumerate() 返回当前所有活动的Thread对象的列表 threading.main_thread() 返回主Thread对象 threading.stack_size(size) 返回创建新线程时使用的线程堆栈大小 size: 可选参数,创建的线程的堆栈大小,并且必须为0(使用平台或配置的默认值)或至少32,768(32 KiB)的正整数。如果不支持更改线程堆栈大小, 引发 RuntimeError 异常。如果size无效,引发 ValueError 异常 threading.TIMEOUT_MAX 线程堵塞的最大超时时间,如果指定的超时值大于此值,引发 OverflowError 异常 threading.local 表示线程本地数据的类 threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None) 线程构造函数 group: 线程所属的线程组,未实现,目前只能为None,保留 target: 线程要执行的方法,默认None name: 线程名称,默认情况下,由 "Thread-N" (N为正整数)格式构成一个唯一的名称 args: 参数元组,默认空元组,以位置参数的形式为target要执行的方法传入参数 kwargs: 参数字典,默认空字典,以关键字参数的形式为target要执行的方法传入参数 daemon: 默认None,线程不是守护线程,True 表示线程是守护线程 threading.Lock 基本锁对象,每次只能获取一次,其他锁请求需要等锁释放后才能获取 threading.RLock 可重入锁对象,同一个线程中可以多次获取,也可以多次释放,但是获取和释放的次数必须要一致 threading.Condition(lock=None) 条件变量对象,允许一个或多个线程等待,直到被另一个线程通知为止lock: 使用的锁对象,默认None,使用RLock锁对象,其他值使用RLock或Lock锁对象 threading.Event 事件对象 这是线程之间通信的最简单机制之一: 一个线程发出事件信号,其他线程等待接收该信号 threading.Semaphore(value=1) 信号量对象 value: 信号量管理的原子计数器,默认1,该原子计数器表示release() 调用的数量减去 acquire()调用的数量以及初始值 acquire() 方法将阻塞直到可以返回而不会使计数器为负数 threading.BoundedSemaphore(value=1) 有界的信号量对象,若当前值超过value(默认1),引发 ValueError 异常 threading.Timer(interval, function, args=None, kwargs=None) 指定的时间间隔过后执行函数的线程 interval: 间隔时间 function: 要执行的函数 args: 执行函数时要传入的参数,默认None,传入空列表 kwargs: 执行函数时要传入的参数,,默认None,传入空字典 threading.Barrier(parties, action=None, timeout=None) 屏障对象 parties: 要创建屏障对象的线程数,必须达到指定数量的线程后才可以继续 action: 线程动作,默认None timeout: 线程超时时间
三、Thread对象常用的一些方法、属性
Thread.start() 启动线程,每个线程最多只能调用一次,多次调用引发 RuntimeError 异常 Thread.run() 线程要执行的方法,可以在子类中重写 Thread.join(timeout=None) 等待 join() 调用的Thread子线程终止的时间会堵塞当前线程,直到 join() 调用的Thread子线程终止(timeout=None)或者超时(timeout=number) timeout: jion() 调用的线程的超时时间,float类型,默认None Thread.name 返回线程名 Thread.getName() 返回线程名,旧的方法 Thread.setName() 设置线程名,旧的方法 Thread.ident 线程的标识符 Thread.is_alive() 返回线程状态 线程处于就绪,运行,堵塞三种状态(即 run()|start() 方法开始之前,直到 run()|start() 方法终止之后)返回 True,新建,死亡两种状态返回 False Thread.daemon = True|False 线程是否设置为守护线程(后台线程),必须在调用 start() 方法之前设置,否则引发 RuntimeError 异常 True为守护线程(后台线程),False为前台线程(非守护线程) 主线程默认是非守护线程(即daemon=False),主线程创建的所有线程默认都是 daemon = False 当没有存活的非守护线程(即所有daemon=False的线程执行结束)时,整个Python程序才会退出 Thread.isDaemon() 线程是否是守护线程,若是返回 True,否则返回 False,旧的方法 Thread.setDaemon(True|False) 线程是否设置为守护线程,和 Thread.daemon 一样,旧的方法