python多进程和多线程的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python多进程和多线程的区别相关的知识,希望对你有一定的参考价值。

进程是程序(软件,应用)的一个执行实例,每个运行中的程序,可以同时创建多个进程,但至少要有一个。每个进程都提供执行程序所需的所有资源,都有一个虚拟的地址空间、可执行的代码、操作系统的接口、安全的上下文(记录启动该进程的用户和权限等等)、唯一的进程ID、环境变量、优先级类、最小和最大的工作空间(内存空间)。进程可以包含线程,并且每个进程必须有至少一个线程。每个进程启动时都会最先产生一个线程,即主线程,然后主线程会再创建其他的子线程。

线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不独立拥有系统资源,但它可与同属一个进程的其它线程共享该进程所拥有的全部资源。每一个应用程序都至少有一个进程和一个线程。在单个程序中同时运行多个线程完成不同的被划分成一块一块的工作,称为多线程。

举个例子,某公司要生产一种产品,于是在生产基地建设了很多厂房,每个厂房内又有多条流水生产线。所有厂房配合将整个产品生产出来,单个厂房内的流水线负责生产所属厂房的产品部件,每个厂房都拥有自己的材料库,厂房内的生产线共享这些材料。公司要实现生产必须拥有至少一个厂房一条生产线。换成计算机的概念,那么这家公司就是应用程序,厂房就是应用程序的进程,生产线就是某个进程的一个线程。

线程的特点:

线程是一个execution context(执行上下文),即一个cpu执行时所需要的一串指令。假设你正在读一本书,没有读完,你想休息一下,但是你想在回来时继续先前的进度。有一个方法就是记下页数、行数与字数这三个数值,这些数值就是execution context。如果你的室友在你休息的时候,使用相同的方法读这本书。你和她只需要这三个数字记下来就可以在交替的时间共同阅读这本书了。

线程的工作方式与此类似。CPU会给你一个在同一时间能够做多个运算的幻觉,实际上它在每个运算上只花了极少的时间,本质上CPU同一时刻只能干一件事,所谓的多线程和并发处理只是假象。CPU能这样做是因为它有每个任务的execution context,就像你能够和你朋友共享同一本书一样。

进程与线程区别:

    同一个进程中的线程共享同一内存空间,但进程之间的内存空间是独立的。

    同一个进程中的所有线程的数据是共享的,但进程之间的数据是独立的。

    对主线程的修改可能会影响其他线程的行为,但是父进程的修改(除了删除以外)不会影响其他子进程。

    线程是一个上下文的执行指令,而进程则是与运算相关的一簇资源。

    同一个进程的线程之间可以直接通信,但是进程之间的交流需要借助中间代理来实现。

    创建新的线程很容易,但是创建新的进程需要对父进程做一次复制。

    一个线程可以操作同一进程的其他线程,但是进程只能操作其子进程。

    线程启动速度快,进程启动速度慢(但是两者运行速度没有可比性)。

由于现代cpu已经进入多核时代,并且主频也相对以往大幅提升,多线程和多进程编程已经成为主流。Python全面支持多线程和多进程编程,同时还支持协程。

参考技术A 多线程指的是一个进程有多个线程运行,线程之间能够共用资源,但是只能靠一个cpu运行,效率不高。
多进程指的是多个进程同时运行,并占用多个cpu,实现并行,效率高,但是进程之间不能随意共享资源,只能通过管道和进程队列交换数据
参考技术B 什么是线程、进程?
进程(process)与线程(thread)是操作系统的基本概念,它们比较抽象,不容易掌握。
关于这两者,最经典的一句话就是“进程是资源分配的最小单位,线程是CPU调度的最小单位”,线程是程序中一个单一的顺序控制流程,进程内一个相对独立的、可调度的执行单元,是系统独立调度和分配CPU的基本单位指运行中的程序的调度单位,在单个程序中同时运行多个线程完成不同的工作,称为多线程。
进程与线程的区别是什么?
进程是资源分配的基本单位,所有与该进程有关的资源,都被记录在进程控制块PCB中,以表示该进程拥有这些资源或正在使用它们,另外,进程也是抢占处理机的调度单位,它拥有一个完整的虚拟地址空间,当进程发生调度时,不同的进程拥有不同的虚拟地址空间,而同一进程内的不同线程共享同一地址空间。
与进程相对应的,线程与资源分配无关,它属于某一个进程,并与进程内的其他线程一起共享进程的资源,线程只由相关堆栈(系统栈或用户栈)寄存器和线程控制表TCB组成,寄存器可被用来存储线程内的局部变量,但不能存储其他线程的相关变量。
通常在一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源,在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。
由于线程比进程更小,基本上不拥有系统资源,所以对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度,从而显著提高系统资源的利用率和吞吐量。
因而近年来推出的通用操作系统都引入了线程,以便进一步提高系统的并发性,并把它视为现代操作系统的一个重要指标。

以上是关于python多进程和多线程的区别的主要内容,如果未能解决你的问题,请参考以下文章

多线程和多进程模式有啥区别

python(33)多进程和多线程的区别

python多进程和多线程的区别

python 多线程和多进程的区别 mutiprocessing theading

python 多进程和多线程配合

多线程和多进程的区别