并发编程 – 线程
并发编程 – 线程
1、什么是线程
进程:资源单位
线程:执行单位
线程与进程都是虚拟的概念,只是为了更好地表达某种事物
注意:开启一个进程,一定会自带一个线程,线程才是真正的执行者
2、为什么要使用线程
> 为了节省资源的占用
> 多线程执行速度非常快
开启进程会发生什么:
> 启动进程会产生一个内存空间,申请一块资源
> 会自带一个主线程
> 开启子进程的速度要比开启子线程的速度慢
开启线程会发生什么:
> 一个进程内可以开启多个线程,从进程的内存空间中申请资源
> 节省资源
# 比如开启三个进程:
# 占用三分内存资源
# 比如开启三个线程:
# 从一个内存资源中,申请三个小的执行单位
问题1:在单核情况下,开启多进程有没有提高执行效率?
没有,在单核情况下,尽量开启多线程。
问题:IO密集型、计算密集型分别使用什么?
IO密集型:多线程
IO(时间由用户决定):
阻塞:切换+保存状态
计算密集型:多进程
计算(时间由操作系统定):
计算时间很长:切换+保存状态
注意:进程与进程之间数据是隔离的,线程与线程之间的数据是共享的
3、线程的两种创建方式、守护线程
守护线程的使用方式和守护进程的使用方式一样,在下面创建线程中体现:
第一种方式:直接调用Thread类
from threading import Thread # Thread用来创建线程 from threading import current_thread # current_thread中含有线程的属性 import time def task(): print(f"start...{current_thread().name}") # current_thread().name 线程的名字 time.sleep(1) print(f"end...{current_thread().name}") # current_thread().name 线程的名字 if __name__ == "__main__": # 模拟开启10个子线程 for i in range(10): # 开启子线程 t = Thread(target=task) # 加上守护线程:主进程结束,代表主线程也结束,子线程有可能会被回收,将其他线程回收资源 t.daemon = True t.start() # 告诉主线程等到子线程执行完成再执行主线程 t.join() print(f"主进程(主线程)结束...{current_thread().name}") # current_thread().name 线程的名字