多任务编程—多进程

什么是多任务编程?

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

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

首先,什么是进程?

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

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

每个进程都会有一个独立的虚拟内存(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,一经查实,立即删除!

相关文章

java锁实现_Java锁实现

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

洛谷 P1027 Car的旅行路线

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

API

api 百科名片 API&#xff08;Application Programming Interface,应用程序编程接口&#xff09;是一些预先定义的函数&#xff0c;目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力&#xff0c;而又无需访问源码&#xff0c;或理解内部工作机制的细节。目…

jsf标签p:ajax_JSF简单Ajax示例

jsf标签<p:ajax>今天&#xff0c;我们将看到一些使用JSF的Ajax简单样本。 如果要查看有关JSF / Web应用程序的其他文章&#xff0c;请单击以下链接&#xff1a; 重定向后的JSF持久化对象和消息 &#xff0c; 使用JAAS和JSF进行用户登录验证 &#xff0c; JSF&#xff1a;…

BIOS维修技术

BIOS是电脑中最基础且最重要的程序&#xff0c;为电脑提供最低级且最直接的硬件控制&#xff0c;电脑的原始操作都是依照固化在BIOS里的程序来完成的。因此如果BIOS出现故障将会导致影响电脑的正常工作。BIOS故障有很多&#xff0c;根据常见的BIOS故障现象及其产生的原因&#…

使用Java Servlet,JSP标签和Stormpath快速构建Java Web App

建筑物身份管理&#xff0c;包括身份验证和授权&#xff1f; 尝试Stormpath&#xff01; 我们的REST API和强大的Java SDK支持可以消除您的安全风险&#xff0c;并且可以在几分钟内实现。 注册 &#xff0c;再也不会建立auth了&#xff01; 我们刚刚发布了Java SDK的主要升级版…

谚语幸运的开始

谚语:幸运的开始 今天收到一个朋友的邮件&#xff0c;打开一看&#xff0c;是幸运谚语&#xff0c;自以为谚语写的非常好&#xff0c;所以转写出来与朋友们分享&#xff01;希望你能得到幸运哦&#xff01;荷兰的谚语幸运谚语幸运的开始关于金钱&#xff1a;你有了钱&#xff…

apache camel_什么时候使用Apache Camel?

apache camelApache Camel是JVM / Java环境中我最喜欢的开源框架之一。 它可以轻松集成使用多种协议和技术的不同应用程序。 本文介绍了何时使用Apache Camel以及何时使用其他替代方法。 问题&#xff1a;企业应用程序集成&#xff08;EAI&#xff09; 由于新产品和新应用&…

GitHub多人协作简明教程

本文面向已经了解/熟悉git基本命令但是并不熟悉如何使用GitHub进行多人协作开发项目的同学。 为了简单起见&#xff0c;这里假设只有两个开发人员&#xff0c;HuanianLi 和 DaxiangLi。他们在GitHub上的地址和角色为&#xff1a; HuanianLi: https://github.com/huanianli # M…

2020地区mysql表_2020年甘肃省军队文职考试职位表下载:张掖地区招13人

2020年6月15日全军面向社会招考文职人员公告已发布&#xff0c;全国招聘27073人&#xff0c;甘肃省招聘370人&#xff0c;其中张掖地区总共招聘13人。此次考试博士招考岗位报名时间为2020年6月17日至21日&#xff0c;其他招考岗位报名时间为7月1日至10日。考试时间为2020年8月2…

superhot预告片下载_预告片:裸指关节SOA

superhot预告片下载我正在研究这个想法&#xff0c;但我不知道它是否对你们有吸引力。 我想就您是否需要进一步探讨提出您的意见。 这是一笔交易&#xff1a;我遇到了一些团队&#xff0c;这些团队在使用SOA技术时由于其工具的绝对复杂性而陷入泥潭。 我只在Java中看到过这种情…

多少秒算长镜头_下中国象棋,能算多少步才算高手?

下象棋&#xff0c;你能算多少步&#xff1f;这是一个让初学者很困扰&#xff0c;也很感兴趣的话题。 很多象棋爱好者说&#xff1a;我最多看2步&#xff0c;我觉得能看5步以上的&#xff0c;就是超级高手高手高高手了。 但一代象棋宗师、14届全国冠军胡荣华的看法则颇有“玄学…

对基于消息队列的Activiti异步执行器进行基准测试

一点历史 永不停息​​的一件事是&#xff0c;Activiti如何以惊人的规模在一些大型组织中使用。 过去&#xff0c;这导致了各种优化和重构&#xff0c;其中包括异步执行器-替换旧的作业执行器。 对于未启动的用户&#xff1a;这些执行器在流程实例中处理计时器和异步继续。 特别…

2020德勤面试开始了吗_2020公务员面试公告已出,5月28日开始面试

重磅&#xff01;上海市2020年度考试录用公务员职位报名及面试工作公告出了&#xff01;报岗时间&#xff1a;2020年5月11日10:00至5月15日18:00岗位调剂&#xff1a;2020年5月18日10:00至5月20日18:00面试时间&#xff1a;2020年5月28日至6月1日面试时需携带哪些证件和材料?答…

阿米洛键盘取消win_阿米洛花旦娘静电容V2键盘测评:不止是一把好看的键盘

文丨me王bigfun社区原文地址&#xff1a;【开箱/测评】阿米洛花旦娘静电容V2键盘&#xff0c;不止是一把好看的键盘 - bigfun序&#xff1a;我想要换一把好的键盘&#xff0c;因为这把雷柏的V500键盘已经跟了我4年&#xff0c;现在的它又老又丑&#xff0c;抚摸起来的手感还很生…

NY : 括号匹配问题

括号配对问题 时间限制&#xff1a;3000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;3描述现在&#xff0c;有一行括号序列&#xff0c;请你检查这行括号是否配对。 输入第一行输入一个数N&#xff08;0<N<100&#xff09;,表示有N组测试数据。后面的N行输入多…

【代码笔记】Web-ionic-select

一&#xff0c;效果图。 二&#xff0c;代码。 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>Todo</title> <meta name"viewport" content"initial-scale1, maximum-scale1, user-scalableno…

adf开发_ADF:动态视图对象

adf开发今天&#xff0c;我想写有关动态视图对象的信息&#xff0c;该对象允许我在运行时更改其数据源&#xff08;SQL查询&#xff09;和属性。 我将使用oracle.jbo.ApplicationModule :: createViewObjectFromQueryStmt方法来解决此问题。 我将逐步介绍如何执行此操作 创建…

stm32f407能跑linux吗_跑步能跑进医院?那我该做跑步运动吗?想健康一点太难了...

跑步能跑进医院&#xff1f;那我该做跑步运动吗&#xff1f;想健康一点太难了&#xff0c;小编学生时期最喜欢的课程永远都是体育课&#xff0c;但最头疼的项目却是磨人的800米和1000米&#xff0c;那简直是我的的噩梦&#xff0c;近日&#xff0c;西安一名初中生跑步居然跑进了…

60秒内使用Java 9的Project Jigsaw的JavaFX HelloWorld

到目前为止&#xff0c;您可能已经听说过Java 9的新模块系统&#xff0c;即项目Jigsaw。 如果您不了解Java 9的新模块系统&#xff0c;则应访问Mark Reinhold的论文“模块系统的状态” 。 此外&#xff0c;您还应该访问nipafx Nicolai Parlog的出色博客&#xff0c; 网址为http…