zoukankan      html  css  js  c++  java
  • threading(多线程)模块(待修改)

    要点概论:

    1. threading模块介绍及常用方法

    2. Thread对象

    3. 线程同步技术

    1 . threading 模块

      threading 模块是 python 支持多线程编程的重要模块,该模块是在底层模块 _thread 的基础上开发的更高层次的线程编程接口,提供了大量的方法和类来支持多线程编程,极大的方便了用户。

      threading 模块的常用方法:

    方法 功能说明
    threading.active_count() 返回当前处于alive状态的Thread对象数量
    threading.current_thread() 返回当前Thread对象
    threading.get_ident()

    返回当前线程的线程标识符。线程标识符是一个非负整数,并无特殊函数,只是用来标识线程,

    该整数可能会被循环利用。python3.3及以后版本支持该方法

    threading.enumerate() 返回当前处于alive状态的所有Thread对象列表
    threading.main_thread() 返回主线程对象,即启动python解释器的线程对象。python3.4及以后版本支持该方法
    threading.stack_size[(size)]

    返回创建线程时使用的栈的大小,如果指定size参数,则用来指定后续创建的线程使用的栈大小,

    size必须是0(表示使用系统默认值)或大于32K的正整数。

    该模块方法的一些简单用法:

    import threading
    
    >>>threading.stack_size()              #查看当前线程栈的大小
    >>>threading.stack_size(64 * 1024)     #设置当前线程栈的大小
    >>>threading.active_count()            #当前活动线程数量
    >>>threading.current_thread()          #当前线程对象
    >>>threading.enumerate()               #当前活动线程对象列表

    2. Thread 对象

      threading 模块提供了 Thread, Lock , Rlock , Ccondition , Event , Timer 和 Semaphore 等大量类来支持多线程编程,

      Thread 是其中最重要也是最基本的一个类,可以通过该类创建线程并控制线程的运行。

      

      Thread 类支持使用两种方法来创建线程:一种方法是为构造函数传递一个可调用对象;另一种方法是继承 Thread 类并在派生类中重写 __init__() 和 run() 方法。

      创建线程对象以后,可以调用其 start() 方法来启动,该方法自动调用该类对象的 run() 方法,此时该线程处于 alive 状态,直至线程的 run() 方法运行结束。

    Thread对象成员:

    成员 说明
    start() 自动调用 run 方法,启动线程,执行线程代码
    run()

    线程代码,用来实现线程的功能与业务逻辑,

    可以在子类中重写该方法来自定义线程的行为

    __init__(self, group=None, target=None, name=None,
    args=(), kwargs=None, *, daemon=None)
    构造函数
    name 用来读取或设置线程的名字
    ident 线程标识,非 0 数字或 None (线程未被启动)
    is_alive() , is_Alive() 测试线程是否处于 alive 状态
    daemon 布尔值,表示线程是否为守护线程
    join(timeout = None) 等待线程结束或超时返回

      

      

    
    
    
    
    
    
    
    

      2.1 Thread 对象中的方法

        1) join([timeour]) :阻塞当前线程,等待被调线程结束或超时后再继续执行当前线程的后续代码,参数 timeout 用来指定最长等待时间,单位为秒。

    创建多线程:(待验证(把for循环换成普通打印就能对上,WTF?)

    import threading
    import time
    
    def func1(x,y):
        for i in range(x,y):
            print(i,end='')
        time.sleep(10)
    
    t1 = threading.Thread(target=func1,args=(15,20))
    t1.start()
    t1.join(5)
    t2 = threading.Thread(target=func1,args=(5,10))
    t2.start()

    【首先输出 15~19 这 5 个整数,然后程序暂停,几秒钟以后又继续输出 5~9 这 5 个整数。如果将 t1.join(5)这一行注释掉再运行,两个线程的输出将会重叠在一起,

     这是因为两个线程并发运行,而不是第一个结束以后再运行第二个。】

        2)is_Alive():测试线程是否处于运行状态

    查看线程状态:

    import threading
    import time
    
    def func1(x,y):
        for i in range(x,y):
            print(i,end='')
        # time.sleep(10)
    
    t1 = threading.Thread(target=func1,args=(15,20))
    t1.start()
    t1.join(5)
    t2 = threading.Thread(target=func1,args=(5,10))
    t2.start()
    t2.join()
    
    print('t1:',t1.isAlive())
    print('t2:',t2.isAlive())

    【最后两个输出都是 Fasle ,即两个线程都执行完了。如果将 ti.join(5) 这一行注释掉会发现最后两行的输出结果没有变化,这是因为 t2,join() 这一行代码会阻塞当前程序直至线程 t2 运行结束,

     对于本例中的线程 t1 基本也运行结束了。如果将线程 t1 的参数范围增大则会发现,倒数第二行的输出结果很可能会变为 True。】

      2.2  Thread 对象中的 daemon属性

        在脚本运行过程中有一个主线程,若在主线程中创建了子线程,当主线程结束时根据子线程 daemon 属性值的不同可能会发生下面的两种情况之一:

        ①当某子线程的 daemon 属性为 Fasle 时,主线程结束时会检测该子线程是否结束,如果该子线程尚未完成,则主线程会等待它完成后再退出。

        ②当某子线程的 daemon 属性为 True时,主线程运行结束时不对该子线程进行检查而直接退出,同时所有 daemon 值为 True 的子线程将随主线程一起结束,而不论是否运行完成。

        daemon 属性的值默认为 False ,如果需要修改,则必须在调用 start() 方法启动线程之前修改。

        PS:以上论述不适用于 IDLE 环境中的交互模式或脚本运行模式,因为在该环境中的主线程只有在退出 python IDLE 时才终止。

        1) 线程的 daemon 属性

        2) 调用线程对象的普通方法

  • 相关阅读:
    《现代操作系统》精读与思考笔记 第一章 引论
    笔试面试中常见的位运算用法
    Linux磁盘概念及其管理工具fdisk
    linux选择sdb sdb4 fat32 还是sda分区
    Linux系统 fdisk命令 创建新分区
    Java----------JMX规范
    Java------------JVM(Java虚拟机)优化大全和案例实战
    Java关键字-----------------java中synchronized关键字的用法
    SQL-----------------------之ON和WHERE的区别
    C语言之单元测试
  • 原文地址:https://www.cnblogs.com/HZY258/p/8455057.html
Copyright © 2011-2022 走看看