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 一样,旧的方法

 

posted @ 2021-02-17 17:03  junffzhou  阅读(174)  评论(0编辑  收藏  举报