多线程中常用的方法

一、join()方法

在子线程完成运行之前,这个子线程的父线程将一直被阻塞。

  • 1、不使用join()方法

    import threading
    import time
    
    def music():
        print('开始听音乐')
        time.sleep(3)
        print('结束听音乐')
    
    def game():
        print('开始玩游戏')
        time.sleep(5)
        print('结束玩游戏')
    
    if __name__ == "__main__":
        print('主线程开始')
        t1 = threading.Thread(target=music)
        t2 = threading.Thread(target=game)
    
        # 启动线程
        t1.start()
        t2.start()
        print('主线程结束')
        """
        1.打印结果
          主线程开始
          开始听音乐
          开始玩游戏
          主线程结束
          结束听音乐
          结束玩游戏
        2.本案例中开了三个线程: 主线程、t1、t2线程
        3.time.sleep(num)是一个IO操作,线程抢占式的操作就会切换到另外一个线程来执行
        """
    
  • 2、使用join()

    import threading
    import time
    
    def music():
        print('开始听音乐')
        time.sleep(3)
        print('结束听音乐')
    
    def game():
        print('开始玩游戏')
        time.sleep(5)
        print('结束玩游戏')
    
    if __name__ == "__main__":
        print('主线程开始')
        t1 = threading.Thread(target=music)
        t2 = threading.Thread(target=game)
    
        # 启动线程
        t1.start()
        t2.start()
        t1.join()
        t2.join()
        print('主线程结束')
        """
        1.打印结果:
          主线程开始
          开始听音乐
          开始玩游戏
          结束听音乐
          结束玩游戏
          主线程结束
        """
    

二、setDaemon(True)线程守护

所谓的线程守护:主线程结束后,被守护的线程会跟着主线程一起结束,注意点:线程守护要写在线程启动之前

  • 1、实现代码

    import threading
    import time
    
    def music():
        print('开始听音乐')
        time.sleep(3)
        print('结束听音乐')
    
    def game():
        print('开始玩游戏')
        time.sleep(5)
        print('结束玩游戏')
    
    threads = []
    
    t1 = threading.Thread(target=music)
    t2 = threading.Thread(target=game)
    
    threads.append(t1)
    threads.append(t2)
    
    if __name__ == '__main__':
        """
        使用关键词setDaemon来创建线程守护,t2线程中会等主线程结束也就结束,不会打印结束完游戏
        """
        t2.setDaemon(True)
        print('主线程开始')
        for t in threads:
            t.start()
        print('主线程结束')
    

三、其它常用的方法

  • run(): 线程被cpu调度后自动执行线程对象的run方法。
  • start():启动线程活动。
  • isAlive(): 返回线程是否活动的。
  • getName(): 返回线程名。
  • setName(): 设置线程名。

threading模块提供的一些方法:

  • threading.currentThread(): 返回当前的线程变量。
  • threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
  • threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。

results matching ""

    No results matching ""