文章目录
- 1 概述
- 1.1 进程 VS 线程
- 1.2 优缺点
- 2 进程
- 2.1 三个步骤
- 2.2 多进程
- 2.3 带参数
- 2.3.1 元组参数 args
- 2.3.2 字典参数 kwargs
- 2.4 获取进程编号
- 2.5 设置进程守护
- 3 线程
- 3.1 三个步骤
- 3.2 多线程
- 3.3 带参数
- 2.3.1 元组参数 args
- 2.3.2 字典参数 kwargs
- 2.4 获取线程编号
- 2.5 设置线程守护
1 概述
1.1 进程 VS 线程
举例说明:
进程:QQ.exe
线程:支撑 QQ.exe 运行的各个程序
1.2 优缺点
优点 | 缺点 | |
---|---|---|
进程 | 可用多核 CPU | 资源开销大 |
线程 | 资源开销小 | 只能单核 CPU |
2 进程
2.1 三个步骤
# 1.导入进程包
import ultiprocessing# 2.通过进程类创建进程对象,参数名有
# target: 执行的目标任务名(函数名、方法名)
# name : 进程名,一般不用设置
# group : 进程组,一般不用设置
进程对象 = ultiprocessing.Process(target=任务名)# 3.启动进程
进程对象.start()
2.2 多进程
import multiprocessing
import time# 唱歌
def sing():for i in range(3):print("唱歌...")time.sleep(1)# 跳舞
def dance():for i in range(3):print("跳舞...")time.sleep(1)if __name__ == '__main__':sing_process = multiprocessing.Process(target=sing)dance_process = multiprocessing.Process(target=dance)sing_process.start()dance_process.start()
2.3 带参数
参数 | 描述 |
---|---|
元组 args | 参数有顺序要求 |
字典 kwargs | 参数无顺序要求 |
import multiprocessing
import time# 唱歌
def sing(num):for i in range(num):print("唱歌...")time.sleep(1)# 跳舞
def dance(num):for i in range(num):print("跳舞...")time.sleep(1)if __name__ == '__main__':sing_process = multiprocessing.Process(target=sing, args=(3,))dance_process = multiprocessing.Process(target=dance, kwargs={"num": 3})sing_process.start()dance_process.start()
2.3.1 元组参数 args
sing_process = multiprocessing.Process(target=sing, args=(3,))
sing_process.start()
2.3.2 字典参数 kwargs
sing_process = multiprocessing.Process(target=dance, kwargs={"num": 3})
sing_process.start()
2.4 获取进程编号
import osprint(os.getpid()) # 当前进程ID
print(os.getppid()) # 当前进程的父ID
2.5 设置进程守护
import multiprocessing
import time# 工作
def work():for i in range(10):print("工作中...")time.sleep(0.5)if __name__ == '__main__':work_process = multiprocessing.Process(target=work)# 设置守护进程work_process.daemon = Truework_process.start()time.sleep(1)print("主进程执行已完成!")
设置守护进程的前后对比图:
3 线程
3.1 三个步骤
# 1.导入线程模块
import threading# 2.通过线程类创建线程对象,参数名有
# target: 执行的目标任务名(函数名、方法名)
# name : 线程名,一般不用设置
# group : 线程组,一般不用设置
线程对象 = threading.Thread(target=任务名)# 3.启动线程执行任务
线程对象.start()
3.2 多线程
import threading
import time# 唱歌
def sing():for i in range(3):print("唱歌...")time.sleep(1)# 跳舞
def dance():for i in range(3):print("跳舞...")time.sleep(1)if __name__ == '__main__':sing_process = threading.Thread(target=sing)dance_process = threading.Thread(target=dance)sing_process.start()dance_process.start()
3.3 带参数
- 同进程
import threading
import time# 唱歌
def sing(num):for i in range(num):print("唱歌...")time.sleep(1)# 跳舞
def dance(num):for i in range(num):print("跳舞...")time.sleep(1)if __name__ == '__main__':sing_process = threading.Thread(target=sing, args=(3,))dance_process = threading.Thread(target=dance, kwargs={"num": 3})sing_process.start()dance_process.start()
2.3.1 元组参数 args
sing_process = multiprocessing.Thread(target=sing, args=(3,))
sing_process.start()
2.3.2 字典参数 kwargs
sing_process = multiprocessing.Thread(target=dance, kwargs={"num": 3})
sing_process.start()
2.4 获取线程编号
import threadingdef work():print(f"线程ID为: {threading.current_thread().ident}")if __name__ == '__main__':work_thread = threading.Thread(target=work)work_thread.start()
2.5 设置线程守护
- 同 进程
import threading
import time# 工作
def work():for i in range(10):print("工作中...")time.sleep(0.5)if __name__ == '__main__':work_thread = threading.Thread(target=work)# 设置守护线程work_thread.setDaemon(True)work_thread.start()time.sleep(1)print("主进程执行已完成!")