Python3多进程、多线程编程,栈与堆的介绍,模块源码简单解析

前言

进程与线程不必多言,自用户级的任务管理器,到编程人员的API调用,甚至于某个项目系统的并行架构设计,都离不开进程与线程。本文重点将日常使用的实例与解决方案代码进行记录,适当介绍关于进程和线程,以及堆和栈的概念。文中编程语言使用的是Python3,但概念与场景同样也适用于Java等其他语言,可跨平台语言对基本资源的使用控制都进行了统一化处理。

一.概念篇(一):进程

进程是资源分配的基本单位。每个进程拥有单独的(虚拟)内存地址空间,拥有代码区域(text region)、数据区域(data region)和堆栈(stack region)等独立的资源区域。在一个程序运行的起始时刻,解析程序运行文件,初始化并装载这些区域就是必经的过程之一,也是成为进程的标志。进程是为了完成某个活动,而进行分配的基础资源集合。

为了更适应多变的编程需求,现代操作系统的进程操作有创建、克隆等多种分配资源方式,适用于不同的场景。但这些模式多半是为了追求性能而诞生的(Linux特有的fork、clone、vfork等),因此在形式上不必拘束于某一种方法。本文实例采用可跨平台的演示方法,对于Python即为multiprocessing模块,方便在不同平台下都可以实践。实际上,如果你执着于Linux等特定平台的编程工作,也可以直接使用fork等函数来完成。推荐在看完例子后对不同的方式进行改写,自行构建场景,这对熟悉工作机制有很大帮助。如果你构建出了新的实用场景,欢迎在评论区补充。

多进程适用于并行化资源处理操作。例如同时转换两个视频的格式,两个任务的资源使用不可分割,这时使用两个进程来同时完成就比较高效。

二.概念篇(二):线程

任务在分配了基础资源之后,就需要有主体来执行操作,线程便是为了这一目的而诞生。在完成任务的过程中,共享分配的基础资源,便是线程的适用范围。例如进程与进程之间的协作的一个常见方案,就可以是由进程拿到基础资源,由线程进行数据处理,然后再进行数据传输等操作。

同样的,为了方便编程操作,线程也诞生了许多分支的模块用法,有些用法与进程颇有几分相似。例如本地线程(ThreadLocal),为了解决多个线程需要保存各自私有变量的需求,ThreadLocal便会在线程创建时初始化单独的栈空间。在这一例子中的线程也可以称为轻量级进程。但对于普通的线程,只有执行权,而没有自主资源管理权,则不能称为轻量级进程。

线程的特点是共享进程资源,这意味着线程在密集型又高延时的操作中可以一展身手。例如每次HTTP报文的完整通讯耗时200毫秒,这对于纳秒级别时间观念的CPU来讲,从请求开始到请求报文完整传递的过程,要耗费的是巨大的等待时间。于是充分利用这些时间来完成更多的任务,便是多进程编程的首要任务。对了,可能你已经读出来了,我刚在描述的场景便是并发,相类似的还有IO读写操作。对于同一类型的业务,充分利用共同的资源,尽量把零散的操作在时间轴上连成一条完整的处理占用线,而不是零散的短线,便是并发编程要做的工作。对比一下进程的并行操作,并行化资源在处理过程中占满时间轴,将这样的任务拆分为多线程执行并没有好处,并且由于多线程的执行权切换反而会导致效率降低,完成任务时间变长

三.概念篇(三):堆和栈

基础资源准备永远应对不了复杂的场景需求,于是堆就占有了能提供给编程人员自由使用的内存空间的一席之地。堆空间经过页空间的引用转换后,最后将直接映射到物理内存条上,堆适用于用户级的自主可控场景。特点:随用随申请,不用则释放。例如打开一个游戏,内存占用就会飙升,这是在申请堆内存,而关闭游戏后就释放了堆内存。

栈是一个固定的内存空间,由进程或本地线程在初始化时自动申请,并且在高级语言中,一般不由编程人员有意识的进行内存空间管理。例如栈用于会保留函数调用现场、局部变量等内容,我们在编程时并不主动关心这些内容的内存使用细节。但对于递归调用,或定义了过大局部变量数组而报错时候,需要能够辨识错误的原因。对了,如果你好奇的话,各种类型的栈多数也是建立在堆空间申请的基础上,固定一定大小的空间来使用的,只是这时的堆申请是进程代你完成

四.实例篇

在讲述了各种概念的基础上,接下来的实例将围绕之前的概念,构建不同的使用场景进行演示。

 

实例:Python3使用fork进行子进程的创建

import os

pid = os.fork()
if (pid == 0):
    print("child-process", os.getpid(), pid)
else:
    print("parent-process", os.getpid(), pid)

# print
parent-process 12386 12387
child-process 12387 0

实例:Python3下使用multiprocessing多进程进行操作

 

参考资料:

进程详解(1)——可能是最深入浅出的进程学习笔记 https://www.cnblogs.com/jacklu/p/5317406.html

② 进程与线程的简单解释 https://www.cnblogs.com/dreamroute/p/5207813.html

③ linux 进程创建clone、fork与vfork https://blog.csdn.net/chenjiayi_yun/article/details/26242245

 

如文中出现错误或疏漏的内容欢迎在评论区指出

 

未完待续,以上留个模板,目前比较少时间开更

展开阅读全文

没有更多推荐了,返回首页