进程
1.1 多任务的概念
多任务在同一时间内执行多个任务
1.2 多任务的执行方式
- 并发
- 并行
1.3 并发
在一段时间内交替执行
(单核cpu一定是并发)
1.4 并行
在一段时间内真正的同时一起执行多个任务
(多个核cpu在一起同时执行多个任务)
2.进程
2.1 程序中实现多任务的方式
在python中, 想要实现多任务可以使用多进程来完成
2.2 进程的概念
进程(process)是资源分配的最小单位, 他是操作系统进行资源分配和调度运行的基本单位, 通俗理解: 一个正在运行的程序就是一个进程
3 多进程完成多任务
3.1进程的创建步骤
- 导入进程包
import multiprocessing
\2. 通过进程累穿件进程对象
进程对象 = multiprocessing.Process()
\3. 启动进程执行任务
进程对象.start()
3.2 通过进程类创建对象
进程对象 = multiprocessing.Process(target=任务名)
| 参数名 | 说明 |
|---|---|
| target | 执行的目标任务名,这里指函数名(方法名) |
| name | 进程名(一般不设置) |
| group | 进程组, 目前只能使用None |
4.进程执行带有参数的任务
| 参数名 | 说明 |
|---|---|
| args | 以元组的方式给执行任务传参 |
| kwargs | 以字典的方式给执行任务传参 |
4.1 args参数使用
进程对象 = multiprocessing.Process(target=任务名, args = (3,4,7))
⚠️多个参数需要注意顺序
4.2 kwargs参数的使用
进程对象 = multiprocessing.Process(target=任务名, kwargs=({‘’name‘’: xiaoming, ’’num’’: 3})
⚠️key的名就是参数的名字
5 获取进程的编号
当程序中进程的数量越来越多, 如果没有办法区分主进程和子进程还有不同的进程, 那么就无法进行有效的进程管理, 为了方便管理实际上每个进程都是有自己的编号
两种方式(import os)
- 获取当前进程编号
os.getpid()
- 获取当前父进程编号
os.getppid()
⚠️进程的注意点
主进程会等待所有子进程执行结束再结束
解决方法:
设置守护(主进程结束子进程自动结束,不再执行)
在启动子进程前 子进程对象.daemon = True
线程
进程是分配资源的最小单位,创建一个进程就会分配一定的资源, 会比较浪费资源
线程是程序执行的最小单位, 线程负责利用资源, 一个进程最少有一个线程来负责执行程序. 线程自己不拥有系统资源, 只需要一点在运行中必不可少的资源, 但它可与同属一个进程的其他线程共享进程所拥有的全部资源
多线程的创建:
- 导入线程模块
import threading
- 通过线程类创建线程对象
线程对象 = threading.Tread(target = 任务名)
- 启动线程对象
线程对象.start()
| 参数名 | 说明 |
|---|---|
| target | 执行的目标任务名,这里指函数名(方法名) |
| name | 进程名(一般不设置) |
| group | 进程组, 目前只能使用None |
主线程会等待所有子线程结束再结束
解决方法:
设置守护主线程 添加参数 daemon = True
或者在线程开始前 线程对象.setdaemon = True
线程的执行是无序的
关系:
- 线程是依附在进程里, 没有进程就没有线程
- 一个进程默认提供一条线程, 进程可以创建多个线程
区别:
- 创建进程的开销要比创建线程要大
- 进程是操作系统资源分配的基本单位, 线程是cpu调度的基本单位
- 线程不能独立执行,必须在进程中
优缺点:
- 进程可以使用多核, 消耗大
- 线程不可以使用多核, 消耗小