1. 什么是进程
一个正在运行的应用程序就是一个进程。系统会给每个进程分配一个独立的内存区域,用来保存程序运行过程中产生的数据,当进程结束的时候,这个内存区域会自动销毁。
2.什么是线程
进程想要执行任务,就必须要有线程。每个进程默认都以一个线程,这个默认线程叫主线程,其他的线程叫子线程。
程序默认都是在主线程中执行的,
一个线程中执行多个任务,任务是串行执行的(一个一个的按顺序执行)。
一个进程中如果有多个线程执行任务的时候,是并行的(同时执行)。
3.python中怎么使用多线程
import threading
- 通过内置的 threading模块来提供多线程相关技术
- threading模块中有一个Tread类,这个类就是线程对象
①直接创建线程类的对象
threading.Thread(target=函数, args=参数)
函数 --function类型的变量;这个函数就会在子线程中执行
参数--元祖;这个元祖中的值会作为实参传给函数
②让线程开始执行任务
线程对象.start()
注意:某个线程出现异常,是线程直接结束;进程不一定结束,只有当所有的线程结束后,进程才结束。
4.创建线程子类
- 声明一个类继承自Thread
- 重写run方法,这个方法中的任务就是需要在子线程中执行的任务
- 创建当前类的对象,就是线程对象
- 启动子线程(线程对象调用start会自动在子线程中去调用run方法;直接用线程对象调用run方法,run方法会在主线程中执行)
5.join的用法
线程对象.join()
程序执行到这个地方会停下来(线程会阻塞),直到线程对象中的任务执行完成后才执行后面的语句
6.多线程共享数据
问题:多条线程对一个数据进行操作的时候,可能会出现数据安全/混乱问题。解决问题的方案就对公共的数据进行加锁。
加锁的方法
- 一个公共数据对应一个锁对象
lock = Lock()
- 在获取数据前加锁,数据操作完成后解锁
lock.acquire(timeout='超时时间') #加锁
lock.release() #解锁
注意:加锁的部分会串行执行,但是没加锁发部分的妈妈还是并行
7.拷贝
①拷贝:将对象中的内容拷贝一份产生一个新的对象。
②浅拷贝和深拷贝:
- 浅拷贝
新对象 = copy(对象)
- 深拷贝
新对象 = deepcopy(对象)