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 一样,旧的方法
Python3之并发(一)---threading模块基础 相关文章
多线程与高并发(六)--容器
概述 Vector Vector存放单个元素,所有方法都是synchronized方法。 基本不用。 Hashtable Hashtable使用哈希表来存储键值对(不支持null键和null值)。 所有方法都是synchronized方法。 基本不用。 HashMap HashMap使用哈希表来存储键值对(支持null键和null
高并发之Semaphore、Exchanger、LockSupport
本系列研究总结高并发下的几种同步锁的使用以及之间的区别,分别是:ReentrantLock、CountDownLatch、CyclicBarrier、Phaser、ReadWriteLock、StampedLock、Semaphore、Exchanger、LockSupport。由于博客园对博客字数的要求限制,会分为三个篇幅: 高并发之Reent
并发工具CountDownLatch源码分析
CountDownLatch的作用类似于Thread.join()方法,但比join()更加灵活。 它可以等待 多个 线程(取决于实例化时声明的数量)都达到预期状态或者完成工作以后, 通知 其他正在等待的线程继续执行。 简单的说,Thread.join()是等待具体的 一个 线程执行完毕,Cou
Java并发之ThreadPoolExecutor源码解析(一)
线程池 假设我们编写了一个Servlet应用,当用户通过浏览器发起一个请求到达我们服务器时,传统的Servlet应用一般针对一个用户请求创建一个线程去执行请求,等到请求执行完毕后,再销毁线程。这种设计在用户量几百或者几千的情况下一般不会有什么大问题,但是
高并发网络框架Netty
Netty概述 Netty是由Jboss提供的一个异步,基于事件驱动的高性能网络通信开源框架,可以快速的开发高性能,高可靠的网络IO程序。 Netty主要是针对TCP协议下,面向client端的高并发应用,或者P2P场景下大量数据持续传输应用。 Netty本质就是一个NIO框架,适用
第39天学习打卡(多线程 Thread Runnable 初始并发问题 Callable )
多线程详解 01线程简介 Process与Thread 程序:是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。 进程则是执行程序的一次执行过程,它是一个动态的概念。是系统资源分配的单位。 通常在一个进程中可以包含若干个线程,当然一个进程中
多线程与高并发(五)--ThreadLocal、强软弱虚引用
ThreadLocal ThreadLocal 适用于每个线程需要自己独立的实例且该实例需要在多个方法中被使用,也即变量在线程间隔离而在方法或类间共享的场景。 ThreadLocal的set方法源码 /** * Sets the current thread's copy of this thread-local variable * to the spe
高并发之ReentrantLock、CountDownLatch、CyclicBarrier
本系列研究总结高并发下的几种同步锁的使用以及之间的区别,分别是:ReentrantLock、CountDownLatch、CyclicBarrier、Phaser、ReadWriteLock、StampedLock、Semaphore、Exchanger、LockSupport。由于博客园对博客字数的要求限制,会分为三个篇幅: 高并发之Reent
并发编程专题七:CountDownLatchSemaphore应用与原理
一、Semaphore是什么 Semaphore 字面意思是信号量的意思,它的作用是控制访问特定资源的线程数目,底层依赖AQS的状态State,是在生产当中比较常用的一个工具类。 二、怎么使用Semaphore 构造方法 1 public Semaphore(int permits) 2 public Semaphore(int pe
python的turtle库绘图
python3的turtle绘图库是python自带的,类似GDI绘图,其中setup函数是设置窗口大小, up()是抬笔,down()是落笔,setposition()设置当前笔在位置,坐标系原点为屏幕中心,可以通过setworldcoordinates(左下角,右上角)来重新设置世界原点, tracer(False) 关