Python中的多进程
进程的概念
- 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
- 它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。
- 在早期面向进程设计的计算机结构中,进程是程序的基本执行实体。
- 在当代面向线程设计的计算机结构中,进程是线程的容器。
- 程序是指令、数据及其组织形式的描述,进程是程序的实体。
- 进程和程序的理解:
- 程序:例如xx.py就是一个程序
- 进程:一个程序运行起来之后,代码 + 用到的资源 称之为进程,它是操作系统分配资源的基本单位。
- 不仅可以通过线程完成多任务,进程也可以。
创建进程:
- 与使用threading创建和启动线程类似,可以通过创建Process 对象来创建一个进程并通过调用进程对象的start()方法来启动该进程。
- Process类中的方法:
方法 | 功能说明 |
---|---|
start() | 创建、启动进程 |
join() | 发生堵塞,直到调用该方法的进程结束后解堵塞 |
- Process创建进程,完成多任务:
- 导入multiprocessing模块
- 创建Process类的对象
- 启动线程(调用run()方法)
import time # 导入 multiprocessing 模块 import multiprocessing def sing(): for i in range(5): print("---唱歌---") time.sleep(1) def dance(): for i in range(5): print("---跳舞---") time.sleep(1) def main(): # 创建 Process类的对象 p1 = multiprocessing.Process(target=sing) p2 = multiprocessing.Process(target=dance) # 创建、启动进程 p1.start() p2.start() if __name__ == "__main__": main()
- Process类的 target参数 和 args参数:
- target参数:指定将来这个进程 去哪个函数执行代码(只带函数名不加括号)。
- args参数:指定将来调用函数的时候 传递什么数据过去。
- args参数为一个元组!
线程与进程对比
- 功能区别:
- 进程:能够完成多任务,比如:在一台电脑上面登录多个QQ
- 线程:能够完成多任务,比如:一个QQ中多个聊天窗口
- 定义的不同:
- 进程是系统进行资源分配和调度的一个独立单位。
- 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是他可以与同属性的一个进程的其他线程共享 线程所拥有的全部资源。
- 区别:
- 一个程序至少有一个进程,一个进程至少有一个线程。
- 线程的划分尺度小于进程(资源比进程少),使得多线程程序并发性高。
- 进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
- 线程不能独立执行,必须依存在进程中。
- 优缺点:
- 线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程相反。