前言
Python 提供 threading 模块用于控制线程处理,使我们可以更加方便地完成多线程任务
目录
1、线程模块的常用属性和方法
2、创建线程对象
3、线程对象的常用属性和方法
4、维护线程安全
正文
1、线程模块的常用属性和方法
active_count():返回当前存活的线程对象的数量
enumerate() :返回当前存活的线程对象的列表
current_thread():返回当前线程对象
main_thread() :返回主线程对象
get_ident():返回当前线程的线程标识符
stack_size([size]):返回创建线程时使用的堆栈大小
TIMEOUT_MAX:指定阻塞函数(如 acquire、wait、wait_for 等)timeout 参数的最大值
import threading thread_number = threading.active_count() print(thread_number) # 1 curr_thread = threading.main_thread() main_thread = threading.current_thread() print(curr_thread == main_thread) # True
2、创建线程对象
threading.Thread(group, target, name, args, kwargs, *, daemon)
- group :为拓展 ThreadGroup 而保留,无需设置,默认为 None
- target:调用对象,默认为 None,表示不需要调用任何方法
- name :线程名称,默认以 Thread-N 的格式命名
- args :传递给调用对象的参数 (位置参数) ,默认为 ()
- kwargs:传递给调用对象的参数 (关键字参数),默认为 {}
- daemon:是否设置为守护线程,默认为 None,表示继承调用者的属性
非守护进程和守护进程的区别:
- 当程序退出时,如果还有非守护线程在运行,程序会等待所有非守护线程结束后才会真正退出
- 当程序退出时,如果还有守护线程运行,程序将会强制结束所有守护线程,导致资源不能正确释放
3、线程对象的常用属性和方法
- name:线程名称
- ident:线程标识符
- daemon:是否为守护线程
- is_alive():线程还是否存活
- import threading
main_thread = threading.current_thread() print(main_thread.name) # MainThread print(main_thread.ident) # 1084 print(main_thread.daemon) # False print(main_thread.is_alive()) # True
start()
:创建一个新的线程并由新的线程调用方法,不同线程同时执行
import threading import time def sleep(wait): name = threading.current_thread().name print(name, 'Start') time.sleep(wait) print(name, 'Terminated') def main(): name = threading.current_thread().name print(name, 'Start') worker = threading.Thread(target = sleep, args = (2,)) worker.start() # 启动工作线程 Thread-1 print(name, 'Terminated') if __name__ == '__main__': main() # 启动主线程 MainThread # 执行结果 # MainThread Start # Thread-1 Start # MainThread Terminated # 沉睡 2 秒 # Thread-1 Terminated
join()
:阻塞调用者线程,直至被调用线程结束
import threading import time def sleep(wait): name = threading.current_thread().name print(name, 'Start') time.sleep(wait) print(name, 'Terminated') def main(): name = threading.current_thread().name print(name, 'Start') worker = threading.Thread(target = sleep, args = (2,)) worker.start() worker.join() # 阻塞线程 MainThread,直至线程 Thread-1 结束 print(name, 'Terminated') if __name__ == '__main__': main() # 执行结果 # MainThread Start # Thread-1 Start # 沉睡 2 秒 # Thread-1 Terminated # MainThread Terminated
run()
:不会创建线程,相当于直接调用方法
import threading import time def sleep(wait): name = threading.current_thread().name print(name, 'Start') time.sleep(wait) print(name, 'Terminated') def main(): name = threading.current_thread().name print(name, 'Start') worker = threading.Thread(target = sleep, args = (2,)) worker.run() # 相当于直接由主线程 MainThread 调用方法 sleep print(name, 'Terminated') if __name__ == '__main__': main() # 执行结果 # MainThread Start # MainThread Start # 沉睡 2 秒 # MainThread Terminated # MainThread Terminated
setDaemon()
:是否设置为守护线程
import threading import time def sleep(wait): name = threading.current_thread().name print(name, 'Start') time.sleep(wait) print(name, 'Terminated') def main(): name = threading.current_thread().name print(name, 'Start') worker = threading.Thread(target = sleep, args = (2,)) worker.setDaemon(True) # 设置工作线程 Thread-1 为守护进程 worker.start() print(name, 'Terminated') # 当程序结束后,会强制终止守护线程 if __name__ == '__main__': main() # 执行结果 # MainThread Start # Thread-1 Start # MainThread Terminated