zoukankan      html  css  js  c++  java
  • 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 一样,旧的方法
  • 相关阅读:
    C#基础笔记(第二十一天)
    C#基础笔记(第十九天)
    C#基础笔记(第十八天)
    C#基础笔记(第十七天)
    C#基础笔记(第十六天)
    C#基础笔记(第十五天)
    [PyTorch 学习笔记] 6.1 weight decay 和 dropout
    PyTorch ResNet 使用与源码解析
    [PyTorch 学习笔记] 5.2 Hook 函数与 CAM 算法
    [PyTorch 学习笔记] 5.1 TensorBoard 介绍
  • 原文地址:https://www.cnblogs.com/gudanaimei/p/14408808.html
Copyright © 2011-2022 走看看