进程(process)
什么是进程
- 进程是操作系统分配资源(CPU、内存等)的最小单元
- 一个运行的程序就是一个进程,一个应用程序至少包括1个进程,而1个进程包裹1个或多个线程
- 进程拥有自己的独立空间,因此进程之间数据不共享。
- 进程运行是无序的
创建进程
1. 导入进程包
import multiprocessing
2. 创建子进程并指定执行的任务
process_name = multiprocessing.Process(target=任务名)
3.启动进程执行任务
process_name.start()
获取进程编号
# 获取当前进程编号
os.getpid()
# 获取当前进程名
multiprocessing.current_process()
# 获取当前进程的父进程
os.getppid()
进程传参
以元组形式传参
以字典方式传参
- 元组方式传参(args): 元组方式传参一定要和参数的顺序保持一致。
- 字典方式传参(kwargs):字典方式传参字典中的key一定要和参数名保持一致。
守护进程
主进程会等待所有的子进程执行结束再结束
设置守护主进程
主进程结束,子进程销毁
线程(thread)
什么是线程
- 线程是操作系统调度的最小单元,不能独立存在,依赖进程
- 一个进程可以由多个线程组成
- 线程之间共享进程的所有资源
- 线程运行是无序的
创建线程
1.导入线程模块
import threading
2.创建子线程并指定执行的任务
sub_thread = threading.Thread(target=任务名)
3.启动线程执行任务
sub_thread.start()
线程传参
设置守护主线程
线程同步的方式
- 线程等待(join)
- 互斥锁
# 创建锁
mutex = threading.Lock()
# 上锁
mutex.acquire()
...这里编写代码能保证同一时刻只能有一个线程去操作, 对共享数据进行锁定...
# 释放锁
mutex.release()
进程线程区别对比
- 进程之间不共享全局变量
- 线程之间共享全局变量,但是要注意资源竞争的问题,解决办法: 互斥锁或者线程同步
- 创建进程的资源开销要比创建线程的资源开销要大
- 进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位
- 线程不能够独立执行,必须依存在进程中
- 多进程开发比单进程多线程开发稳定性要强
优缺点对比
- 进程优缺点:
- 优点:可以用多核
- 缺点:资源开销大
- 线程优缺点:
- 优点:资源开销小
- 缺点:不能使用多核