多任务编程—多进程

什么是多任务编程?

  多任务编程其实和计算机系统内核有关,通过程利用多个计算机内核同时执行程序,以此来提升程序执行的效率。

  多任务编程其中包括,多进程、多线程和多协程,这三种多任务编程各有各的优点和缺点,本章就来讲一下进程。

首先,什么是进程?

  进程就是一次执行的程序,最直接的例子就是我们常用的任务管理器,任务管理器,任务管理中每一个运行中的程序其实都叫进程。  

  在编程中进程是程序的一种动态过程的描述,进程在执行过程中会占用我们计算机内的资源,但是每个进程都有自己的生命周期(进程在系统内核所存在的时间),生命周期结束后进程会自动销毁。

每个进程都会有一个独立的虚拟内存(4g),使其在运行过程中独立进行。

  

   进程的在编程中的作用是为了处理程序并发的一种方式或者说是方法可能会更贴切一点,进程适用于同一程序每次都执行不同的任务,我们称之为多进程,多进程中分为父进程和子进程。

  创建进程的方式一共有两种:

  第一种:导入 import os 模块 ,利用 os 模块中的fork( )内建函数来创建子进程,fork( )创建并不难,但是最值得注意的是fork( )这个函数返回值,这个函数相比于其他函数有些特殊,fork( )自身拥有三种返回值,分别是小于0,等于0 和大于0的pid(系统对进程的唯一编号)数字,这三种分对应着不同的处理结果。

小于0 —【建子进程失败

等于0 —【创建子进程成功】

大于 0—【父进程】

  在创建过程中一般情况下都会给fork( )的返回值设定一个if判断语句,以此来确认子进程是否创建成功,至于这个返回值的判断机制是完全由系统内核经过自动计算后所返回的,这个是机制是不可抗的。下面我们就来创建一个子进程实例,代码如下:

import os


print('---------分割线-----------')

pid = os.fork()#开始创建子进程
print('fock返回的pid号',pid)

if pid < 0:
print('创建子进程失败')

elif pid == 0:
print('创建子进程成功')

else:
print('这是父进程') #父进程会先执行

运行结果:

 

 

  由此我们可以出所返回值,运行程序中分别生成了一个大于0和一个 等于0数字,说明子进程已经创建成功,因此小于0的值并不会被生成出来。我们可以在已创建的子进程中可以添加自己所需要的内容,让每个程序都在一个子进程中独立分开执行,达到并发效果。那么在创建成功后子进程都会包含什么?

  子进程会复制父进程中所有的代码,但是子进程不会执行所复制的所有代码段,它只会运行所创建的子进程代码段,父进程的代码段子进程并不会去运行。(紫色的部分代表分别要执行的代码段

  如下图:

 

  如果多个进程在同时抢占计算机资源时应该怎么办,实际上会使计算机对所有进程进行一种快速切换的机制,a进程和b进程同时执行的时候谁先谁后不可定,但是他们一定是交叉运行的。在运行a进程时计算机会把资源 分配给a去使用,但是这时候b进程突然运行,计算机就会把资源在分配给 b去运行,这个过程就是计算机内部的资源分配机制。

  但是使用fork( )创建多个子进程就会非常麻烦,子进程中嵌套二级子进程以此类推,这样不停的去使用if嵌套在结构上是一种很不好的一种体验,所以在python中有一个更加清晰简洁的一种创建方式,使用multiprocessing模块中的Process去创建多个子进程。

 

 

target=‘目标函数'

agrs=(’参数',)#元组传参

kwargs ={'key':‘value’}#字典传参

name='命名' 

start( ) #启动子进程

join( ) #子进程的回收

  它的代码结构非常的清晰,但是相对于fork( ) 它增加了两个机制,一个是启动函数strart( ) 和阻塞等待子进程回收机制 join( ),只有所有的子进程全部执行完毕后才会回收,这两个函数分别控制子进程的开始和结束,其中jion( )这个函数里面可以添加参数(秒),在输入相应的数字时会自动开始倒计时等待,如果在倒计时结束后join( )机制会执行,但是这个时候join( )子进程并没有结束,父进程检测到没有join阻塞也会执行,这个时候子进程就变为了孤儿进程,孤儿进程在执行完毕后,会在系统中找一个继父并结束,也就是说这个继父收养了这个孤儿进程,使其能够正常结束。

 进程的三态和五态:

三态

就绪态 : 进程具备运行条件,等待系统分配处理器运行
运行态 : 进程占有cpu处于运行的状态
等待态 : 又称为阻塞态,睡眠态,指进程暂时不具备运

五态

新建态 : 创建一个进程,获取资源,直接表现为运行一个程序,或者在程序中创建新的进程

终止态 : 进程执行结束,资源回收过程

  进程池:

  进程池:一次创建多个进程批量执行多个任务的程序,频繁大量的任务建议使用进程池  比如一个进程创建后每两秒就销毁,但是任务两很大需要大量重复这个创建销毁的过程,这种情况下就建议使用进程池去处理 ,打个比方,一辆车上需要搬运200个西瓜才能达到运送标准,在搬运西瓜给货车的同时有n个人一起去完成这个任务,每次填装的西瓜数量是n个,可以很快的就将这200个西瓜装载完毕,大大的 节省了时间成本,所谓的进程池的执行方式就是这个概念。

  进程池每次处理事件时不会像普通进程那样每次处理完事件就会回收,进程池只有处理完所有的事件才会统一回收,再打个比方给大家:

我们创建了四个进程,事件需要执行20次,那么这个进程池每次可以处理1-4这四次事件后并不会回收,等到需要再次处理5-8这四个进程时在开启,随后再次关闭,这违背了进程池设计的初衷,进程池内只有执行完这20次的所有事件后才会结束销毁。

  创建进程池使用 Pool函数,形式上和创建进程大同小异,首先需要创建一个事件函数,准备执行,使用Pool(processes=n)来创建n个进程,等待事件的处理,进程池不需要使用start( ) 函数来启动进程,进程池内有它特有的处理事件的机制,因为在在进程池创建完成后进程就已经是处在一个等待运行的状态了,将事件放入后,进程会立即执行所放入的事件。

  异步处理和同步处理。

  异步处理:apply_async( ) 第一个参数为所执行的目标函数,第二个参数为实参,实参的传递方式可以选择元祖传参和字典传参,在调用函数和传递参数时不需要通过target和args调用, 异步处理会抢占时间片,可以理解成异步处理是一种无序随机运行。

  同步处理:apply( ) 同步处理的调用和传递实参的方式和异步处理相同,二者唯一的区别就是一个是有序运行,一种是无序运行。

  close( )

  进程池中的join( )同样是等待进程回收,这个之前就已经说过来了,就不在细说,我们重点来看一下这个close( ), close关闭并不是终止进程池运行,而是‘关闭’进程池使其不在接受其他新的事件元素 ,并不是所谓的终止运行。

  map函数 

  进程池中可以使用map函数对进程池中的数据进行处理,map函数我们在接触高阶函数的时候就已经接触过了,但是在这里还有一些小小的不同。

  以上代码所示:在进程池中使用map处理元素 ,第一个参数为需要调用 的目标函数,第二个位置是一个迭代器,将迭代对象传入事件进行处理,因为 l 这个跌迭对象拥有6个元素,但是我们的进程池只有三个进程(每处理一次让他停一秒,方便我们观察),所以每秒钟只能处理三个元素,两秒后处理完毕,最终将结果打印在终端上。

  注:如果在多进程中需要让第一个子进程完全执行完毕后,在执行第二个子进程,以此类推,这样的情况可以考虑使用进程所 Lock或Event去设置子进程的阻塞状态,改变执行效果。

 

转载于:https://www.cnblogs.com/Jimmy1995/p/9323177.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353267.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB数值取整

fix(x);%截尾取整&#xff0c;下取整floor(x);%高斯取整&#xff0c;不超过x的最大整数ceil(x);%大于x的最小整数&#xff0c;上取整round(x);%四舍五入取整

Tomcat权威指南-读书摘要系列6

6. Tomcat 安全防护 使用SecurityManager 在Tomcat中&#xff0c;决定安全策略的配置文件是$CATALINA_HOME/conf/catalina.policy&#xff0c;在用-security选项调用Tomcat的时候&#xff0c;JVM读取这一文件。以安全模式启动Tomcat.\catalina.bat start -security 安全漏洞 Cr…

MATLAB找波峰波谷

全局波峰波谷&#xff1a;max();min();所有波峰波谷&#xff1a;findpeaks();pks findpeaks(data) [pks,locs] findpeaks(data) ------pks 对应峰值&#xff0c;locs 对应峰值位数 [...] findpeaks(data,minpeakheight,mph)----mph 设定峰值的最小高度 [...] findpeaks(dat…

chrome 浏览器全屏操作

chrome.exe -kiosk [网页]转载于:https://www.cnblogs.com/yang95/articles/9335975.html

java锁实现_Java锁实现

java锁实现我们都将第三方库用作开发的正常部分。 通常&#xff0c;我们无法控制其内部。 JDK随附的库是一个典型示例。 这些库中的许多库都使用锁来管理争用。 JDK锁具有两种实现。 一个使用原子CAS样式指令来管理索赔过程。 CAS指令往往是最昂贵的CPU指令类型&#xff0c;并且…

2023年12月青少年机器人技术等级考试(五级) 实操试卷

主题&#xff1a;按键控制心形图案交互显示 器件&#xff1a;ESP32主控板1块&#xff0c;按键模块1个&#xff0c;8x8LED点阵1个&#xff0c;74HC595移位寄存器芯片&#xff08;或模块&#xff09;及相应辅件。以上模块也可使用分立器件结合面包板搭建。 任务要求&#xff1a; …

MATLAB正太分布函数

normcdf(x); %标准正态分布的分布函数。 normcdf(x,mu,sigma); %带平均值和方差μ和σ的正态分布&#xff0c;标准正态分布就是mu0,sigma1的特例。%例如>> normcdf(0,0,1)ans 0.5>> normcdf(inf,0,1)ans 1>> normcdf(-inf,0,1)ans 0

编写自己的工具箱 (一)

仔细想了一下 决定先解决一下调用的问题&#xff0c; 这样无比要解决异步获取 !function(){var requireOption window.requireOption || {path : ,};var windowIsLoad false;var key setInterval(function(){if( document.body || windowIsLoad ){windowIsLoad true;clearI…

ANTLR入门:构建一种简单的表达语言

这是该系列的第一篇文章。 本系列的目的是描述如何创建有用的语言和所有支持工具。 在本文中&#xff0c;我们将开始研究一种非常简单的表达语言。 我们将在语言沙箱中构建它&#xff0c;因此我们将其称为语言Sandy 。 我认为工具支持对于一种语言至关重要&#xff1a;因此&a…

Matlab回归分析regress和polyfit

在matlab中regress()函数和polyfit()函数都可以进行回归分析。 (1)regress()函数主要用于线性回归,一元以及多元的。它可以提供更多的信息,残差之类的。 (2)polyfit()函数是利用多项式拟合。可以是线性也可以是非线性的。 (1)regress()函数详解 [b,bint,r,…

ACM计算几何题目推荐

一。基础题目 1.1 有固定算法的题目 A&#xff0c; 最近点对问题 最近点对问题的算法基于扫描线算法。 ZOJ 2107 Quoit Design 典型最近点对问题 POJ 3714 Raid 变种最近点对问题 B&#xff0c;最小包围圆 最小包围圆的算法是一种增量算法&#xff0c;期望…

洛谷 P1027 Car的旅行路线

P1027 Car的旅行路线 题目描述 又到暑假了&#xff0c;住在城市 AA 的 CarCar 想和朋友一起去城市 BB 旅游。她知道每个城市都有 44 个飞机场&#xff0c;分别位于一个矩形的 44 个顶点上&#xff0c;同一个城市中 22 个机场之间有 11 条笔直的高速铁路&#xff0c;第 II 个城市…

Matlab各种拟合

线性拟合见上一篇《回归分析》 非线性拟合: cftool %curve fitting toolbox非线性函数拟合工具箱。要确定系数的初始值和上下限(sftool用于三维的) %该函数可以生成m文件函数,方便在编程中使用,但是生成的m文件函数拟合的结果会有很大的误差和图形界面的结果不一样 1 comman…

Matlab线性规划(Linear Programming)

bintprog&#xff1a;0-1规划linprog:线性规划quadprogoptimtool整数规划第三方工具箱&#xff1a;YALMIP http://users.isy.liu.se/johanl/yalmip/pmwiki.php?nMain.Download

java(IO)读写文件乱码转换UTF-8问题

java(IO)读写文件乱码转换UTF-8问题 读取文件String Content  ""; // 文件很长的话建议使用StringBuffertry {FileInputStream fsnew FileInputStream("文件录取");InputStreamReader isr  new InputStreamReader(fis, "UTF-8");Buff…

类固醇上的Java:5种超级有用的JIT优化技术

Java开发人员&#xff1f; 优化您的生产监控。 请在所有已记录的错误&#xff0c;警告和异常之后查看源代码&#xff0c;调用堆栈和变量状态- 尝试Takipi 。 最有用的JVM JIT优化有哪些&#xff1f;如何使用它们&#xff1f; 即使您没有积极计划&#xff0c;JVM也有很多技巧可…

poj3714 最近点对

最近点对&#xff0c;采用分治方法。过程&#xff1a; 1对原数组依据x左标从小到大排序。 2二分数组&#xff0c;左边求出最小值&#xff0c;右边求出最小值&#xff0c;我们求最小的。 3找出对于左右两边的可能小于当前最小值的最近点对&#xff0c;更新最小值。 这题目需要区…

Matlab 格式化字符串sscanf

sscanf 是按一定的格式从字符串中读取出字符,它有以下几种用法: A = sscanf(str, format) A = sscanf(str, format, sizeA) [A, count] = sscanf(...) [A, count, errmsg] = sscanf(...) [A, count, errmsg, nextindex] = sscanf(...) Description A = sscanf(str, forma…

2018牛客暑假多校二 D(贪心)

题目描述&#xff1a; 你要按照顺序以此经过n个商店&#xff0c;每到达一个商店你可以购买一件物品&#xff0c;也可以出售你手中的商品。 同一时刻你手上最多拿一件商品。在第i个商店购买和出售的代价都是a[i]。 问你经过完n个商店后的最大收益。 同时&#xff0c;在最大化收…

ZOJ1450 Minimal Circle 最小圆覆盖

包含点集所有点的最小圆的算法 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId450 平面上有n个点&#xff0c;给定n个点的坐标&#xff0c;试找一个半径最小的圆&#xff0c;将n 个点全部包围&#xff0c;点可以在圆上。 1. 在点集中任取3点A,B,C。 2. 作一个包…