多线程中常用的方法
一、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())
有相同的结果。