线程
进程是分配资源的最小单位,一旦创建一个进程就会分配一定的资源,就像跟两个人聊QQ就需要打开两个QQ软件一样是比较浪费资源的.
线程是程序执行的最小单位,实际上进程只负责分配资源,而利用这些资源执行程序的是线程,也就说进程是线程的容器,一个进程中最少有一个线程来负责执行程序.同时线程自己不拥有系统资源,只需要一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源.这就像通过一个QQ软件(一个进程)打开两个窗口(两个线程)跟两个人聊天一样,实现多任务的同时也节省了资源.
多线程的作用
◆多线程是Python程序中实现多任务的一种方式.
◆线程是程序执行的最小单位.
◆同属一个进程的多个线程共享进程所拥有的全部资源
线程创建
与上一章的多进程大同小异
1.导入线程模块
import threading
2.通过线程类创建线程对象
线程对象=threading.Thread(target=任务名)
3.启动线程执行任务
线程对象.start()
1 #创建子线程 2 sing_thread=threading.Thread(target=sing) 3 #创建子线程 4 dance_thread=threading.Thread(target=dance) 5 #启动线程 6 sing_thread.start() 7 dance_thread.start()
带参数的线程也算差不多
主线程和子线程的结束顺序
◆主线程会等待所有的子线程执行结束再结束,除非设置子线程守护主线程
◆设置守护主线程有两种方式:
1.threading.Thread(target=work,daemon=True)
2.线程对象.setDaemon(True)
注意第二个要在线程开启前设置
线程间的执行顺序
◆线程之间执行是无序的,是由CPU调度决定某个线程先执行的。
1 # 2 # @author:浊浪 3 # @version:0.1 4 # @time: 2021/8/1 22:19 5 # 6 import threading 7 import time 8 9 10 def task(): 11 time.sleep(1) 12 #current thread:获取当前线程的线程对象 13 thread=threading.current_thread() 14 print(thread) 15 if __name__ =='__main__': 16 for i in range(5): 17 sub_thread=threading.Thread(target=task) 18 sub_thread.start() 19 20 #结论:多线程之间执行是无序。由cpu调度。 21 ''' 22 输出 23 <Thread(Thread-5, started 14428)><Thread(Thread-3, started 42576)> 24 <Thread(Thread-2, started 36360)> 25 <Thread(Thread-1, started 67972)> 26 <Thread(Thread-4, started 36532)> 27 '''
进程和线程的对比
关系对比
1.线程是依附在进程里面的,没有进程就没有线程。
2.一个进程默认提供一条线程,进程可以创建多个线程。
区别对比
1.创建进程的资源开销要比创建线程的资源开销要大
2.进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位
3.线程不能够独立执行,必须依存在进程中
优缺点对比
1.进程优缺点:
优点:可以用多核
缺点:资源开销大
2.线程优缺点:
优点:资源开销小
缺点:不能使用多核