python全栈开发 * 进程理论 进程创建 * 180724
一.进程理论
1.进程是资源分配的最小单位.
2.进程调度就是多个进程在操作系统的控制下被CPU执行,去享用计算机的资源.
先来先服务
短作业优先
时间片轮转
多级反馈队列
3.进程调度的过程是不能够随意被程序影响的
4.进程的三个状态: 就绪 运行 阻塞
就绪状态: 当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。
运行转态: 当进程获得处理机,其程序正在处理机上执行,此时的进程状态称为运行状态.
阻塞状态: 正在执行的程序,由于等待某个事情发生而无法执行时,便放弃处理机而处于阻塞状态,引起进程阻塞的事件有多种,等待IO完成,
等待信件,申请缓冲区不能满足.
eg:
程序在开始运行之后,并不是立即开始执行代码,而是会进入就绪状态,等待操作系统调度开始运行
import time
print("程序开始运行") 程序运行状态
name=input(">>>") 等待用户输入 程序进入阻塞状态
用户输入后进程并不是立即执行,而是进入就绪状态,等待操作系统的调度继续运行
print(name) 运行状态
time.sleep(1) 阻塞状态
就绪状态
print("程序结束运行") 运行状态
结束
5.进程三状态转换流程图:
a.创建--(提交)--> 就绪--(进程调度)--> 运行--(释放)--> 退出
b.创建--(提交)--> 就绪--(进程调度)--> 运行--(时间片结束)--> 就绪
c.创建--(提交)--> 就绪--(进程调度)--> 运行--(事件请求IO)--> 阻塞--(事件发生)--> 就绪
6.PID 和 PPID
PID: ProcessID 进程ID
PPID: parent processID 父进程ID (父进程回收子进程的一些资源)
二.进程的创建与结束
1.进程的创建
引入:但凡是硬件,都需要有操作系统去管理,只要有操作系统就有进程的概念,就需要有创建进程的方法.
对于通用系统(跑很多应用程序),需要有系统运行过程中创建或撤销进程的能力.主要有四种形式创建新的进程.
(1).系统初始化(查看进程 linux中用ps命令,windows中用任务管理器,前台进程负责与用户交互,后台运行的进程与用户无关,运行在
运行在后台并且只在需要时才唤醒的进程,称为守护进程,(如"电子邮件","web页面","新闻","打印")
(2).一个进程在运行过程中开启了子进程(os)
(3).用户的交互式请求,而创建一个新进程("双击qq")
(4).一个批处理作业的初始化(只在大型机的批处理系统中运用).
创建子进程unix和windows的异同:
相同点:进程创建后,父进程和子进程有各自不同的地址空间(多道技术要求物理层面实现进程之间内存的隔离),任何一个进程
的在其地址空间中的修改都不会影响到另外一个进程。
不同点: 在UNIX中,子进程的初始地址空间是父进程的一个副本,提示:子进程和父进程是可以有只读的共享内存区的。但是对于
windows系统来说,从一开始父进程与子进程的地址空间就是不同的。
2.进程的结束
(1)正常退出(自愿,用户点击交互式页面的叉号,或程序执行完毕调用发起系统调用正常退出,在linux中用exit,在windows中用ExitProcess)
(2)出错退出(自愿,python a.py中a.py不存在)
(3)严重错误(非自愿,执行非法指令,如引用不存在的内存,可以捕捉异常,try...except...)
(4)被其他进程杀死(非自愿,如右键结束进程
三.在python程序中的进程操作
multiprocess不是一个模块而是python中一个操作、管理进程的包。 之所以叫multi是取自multiple的多功能的意思,在这个包中几
乎包含了和进程有关的所有子模块。由于提供的子模块非常多,为了方便大家归类记忆,
我将这部分大致分为四个部分:创建进程部分,进程同步部分,进程池部分,进程之间数据共享。
multiprocess.process
1.process模块介绍: process模块是一个创建进程的模块.借助这个模块,就可以完成进程的创建.
Process([group [, target [, name [, args [, kwargs]]]]]),由该类实例化得到的对象,表示一个子进程中的任务(尚未启动)
强调:
(1). 需要使用关键字的方式来指定参数
(2). args指定传给target函数的位置参数,是一个元组形式,必须有逗号
参数介绍:
(1) group参数未使用,值始终为None
(2)target表示调用对象,即子进程要执行的任务
(3) args表示调用对象的位置参数元组,args=(1,2,'egon',)
(4) kwargs表示调用对象的字典,kwargs={'name':'egon','age':18}
(5) name为子进程的名称
方法介绍:
(1) p.start():启动进程,并调用该子进程中的p.run()
(2) p.run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法
(3) p.terminate():强制终止进程p,不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,使用该方法需要特别小心这
种情况。如果p还保存了一个锁那么也将不会被释放,进而导致死锁
(4) p.is_alive():如果p仍然运行,返回True
(5) p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。timeout是可选的超时时间,需要强
调的是,p.join只能join住start开启的进程,而不能join住run开启的进程
在windows中使用process模块的注意事项:
在Windows操作系统中由于没有fork(linux操作系统中创建进程的机制),在创建子进程的时候会自动 import 启动它的这个文件,
而在 import 的时候又执行了整个文件。因此如果将process()直接写在文件中就会无限递归创建子进程报错。所以必须把创建子进程
的部分使用if __name__ ==‘__main__’ 判断保护起来,import 的时候 ,就不会递归运行了。
四.创建进程
(一).创建一个进程 并给子进程传参
import os
import time
from multiprocessing import Process
def func(num): #形参num print("in func",num,os.getpid(),os.getppid()) #4 in func 1 4376 3180 #6 in func 2 20072 3180
print(__name__) #5 __mp_main__ #7 __mp_main__
if __name__=="__main__": print("in main",os.getpid(),os.getppid()) #1 in main 20208 20572
p=Process(target=func,args=(1,)) #关键字传参
p.start()
p1=Process(target=func,args=(2,)) #用args,必须是元组形式( , )
p1.start()
print(__name__) #2 __main__
print("主进程结束") #3 主进程结束
原理:
if __name__ == '__main__':
使用python都是调用操作系统的命令来启动进程
同样使用python 不同的操作系统的操作是不同的
对于windows来说 必要加if __name__ == '__main__':
对于linux ios来说 不必要加if __name__ == '__main__':
(二).其他方法和属性
1.开启多个子进程
import os
from multiprocessing import Process #Process 是一个类
def func(num): #形参num
print("in func",num,os.getpid(),os.getppid())
print(__name__) # __mp_main__
if __name__=="__main__":
print("in main",os.getpid(),os.getppid())
for i in range(10):
p=Process(target=func,args=(i,)) # 关键字传参 必须是元组形式,用逗号隔开.
p.start() #向操作系统提交开启一个子进程的申请
print("主进程结束")
2.join 方法
import os
import time
from multiprocessing import Process
def func(num):
time.sleep(1)
print("in func",num,os.getpid(),os.getppid()) if __name__=="__main__":
print("in main",os.getpid(),os.getppid())
p=Process(target=func,args=(1,))
p.start() #不是运行一个程序,而是调用操作系统的命令,要创建子进程
p.join() #阻塞直到p这个子进程执行完毕之后再继续执行后面的代码
print('主进程的代码结束')
3.一批任务用join
import os
import time
from multiprocessing import Process
def func(num):
print("in func",num,os.getpid(),os.getppid()) if __name__=="__main__":
print("in main",os.getpid(),os.getppid())
p_l = []
for i in range(10):
p=Process(target=func,args=(i,))
p.start()
p_l.append(p)
print(p_l)
for p in p_l:
p.join()
print("主进程代码结束")
4.is_alive terminate
import os
import time
from multiprocessing import Process
def func(num):
print("in func",num,os.getpid(),os.getppid()) if __name__=="__main__":
print("in main",os.getpid(),os.getppid())
p=Process(target=func,args=(1,))
p.start()
print(p.is_alive()) # True 检测进程是否在执行任务
p.join() # 阻塞 等子进程结束后再执行后面的代码
print(p.is_alive()) #False 子进程任务已经结束
p.terminate() #强制结束子进程 非阻塞
print(p.is_alive())
5.用面向对象的方式开启子进程
import os
from multiprocessing import Process
class MyProcess(Process):
def __init__(self,num):
super().__init__()
self.num=num
def run (self):
print("in run",self.num,os.getpid(),os.getppid()) if __name__=="__main__":
print("in main",os.getpid(),os.getppid())
p=MyProcess(1)
p.start()
python全栈开发 * 进程理论 进程创建 * 180724的更多相关文章
- Python全栈开发 线程和进程
一.线程 线程是程序工作的最小单元,由进程生成,生成的线程间会共享内存空间.Python中创建线程比较简单,导入threading模块,创建线程实例.下面这段代码是一个简单的多线程例子 import ...
- python 全栈开发,Day39(进程同步控制(锁,信号量,事件),进程间通信(队列,生产者消费者模型))
昨日内容回顾 python中启动子进程并发编程并发 :多段程序看起来是同时运行的ftp 网盘不支持并发socketserver 多进程 并发异步 两个进程 分别做不同的事情 创建新进程join :阻塞 ...
- Python全栈开发【模块】
Python全栈开发[模块] 本节内容: 模块介绍 time random os sys json & picle shelve XML hashlib ConfigParser loggin ...
- 自学Python全栈开发第一次笔记
我已经跟着视频自学好几天Python全栈开发了,今天决定听老师的,开始写blog,听说大神都回来写blog来记录自己的成长. 我特别认真的跟着这个视频来学习,(他们开课前的保证书,我也写 ...
- python全栈开发中级班全程笔记(第二模块、第四章)(常用模块导入)
python全栈开发笔记第二模块 第四章 :常用模块(第二部分) 一.os 模块的 详解 1.os.getcwd() :得到当前工作目录,即当前python解释器所在目录路径 impor ...
- Python全栈开发【面向对象】
Python全栈开发[面向对象] 本节内容: 三大编程范式 面向对象设计与面向对象编程 类和对象 静态属性.类方法.静态方法 类组合 继承 多态 封装 三大编程范式 三大编程范式: 1.面向过程编程 ...
- python 全栈开发,Day99(作业讲解,DRF版本,DRF分页,DRF序列化进阶)
昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...
- 学习笔记之Python全栈开发/人工智能公开课_腾讯课堂
Python全栈开发/人工智能公开课_腾讯课堂 https://ke.qq.com/course/190378 https://github.com/haoran119/ke.qq.com.pytho ...
- Python 全栈开发【第0篇】:目录
Python 全栈开发[第0篇]:目录 第一阶段:Python 开发入门 Python 全栈开发[第一篇]:计算机原理&Linux系统入门 Python 全栈开发[第二篇]:Python基 ...
- Python全栈开发【面向对象进阶】
Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...
随机推荐
- AS使用lombok注解报错:Annotation processors must be explicitly declared now. The following dependencies on the compile classpath are found to contain annotation processor.
Rebuild时报错信息如下所示: Error:Execution failed for task ':app:javaPreCompileDebug'.> Annotation process ...
- go test 测试用例那些事
go test命令,相信大家都不陌生,常见的情况会使用这个命令做单测试.基准测试和http测试.go test还是有很多flag 可以帮助我们做更多的分析,比如测试覆盖率,cpu分析,内存分析,也有很 ...
- VS插件File Nesting
开发者们一直以来都是使用Visual Studio的解决方案管理器 中的嵌套功能管理项目的子文件夹,使得文件组织清晰.便于访问.鉴于现在的项目巨大的文件数目,如果能将这种嵌入能力应用于项目的其他子项上 ...
- [转]PID控制算法原理
PID控制算法是工业界使用极其广泛的一个负反馈算法,相信这个算法在做系统软件时也有用武之处,这里摘录了知乎上的一篇文章,后面学习更多后自己总结一篇 以下为原文: PID控制应该算是应用非常广泛的控制算 ...
- markdown列表中的缩进
使用markdown时,一向不敢使用多级列表,因为多级列表容易出错.而实际上,只需要缩进两个空格就可以实现嵌套了. * one 这个是one的内容 * two 这个是two的内容 * three * ...
- Python3 字符串前面加u,r,b的含义
u/U:表示unicode字符串 不是仅仅是针对中文, 可以针对任何的字符串,代表是对字符串进行unicode编码. 一般英文字符在使用各种编码下, 基本都可以正常解析, 所以一般不带u:但是中文, ...
- 使用DotfuscatorPro_4.9对软件dll库进行加密
点击settings选项,Disable String Encryption改成NO,具体里面的设置如下图. 再点击Rename选项下的options,左边的选项勾上,再把Renaming Schem ...
- virtualbox安装android6.0并设置分辨率为1920x1080x32
下载安装:https://www.cnblogs.com/wynn0123/p/6288344.html 这里我做的是下载android6.0-64bit,然后文件系统只支持ext4 安装完成之后我的 ...
- ASP.NET MVC 右键点击添加没有区域(Area)、控制器、试图等选项
在MVC项目中准备添加控制器.区域时发现没有控制器这个选项,当时没有在意以为VS出问题了,网上所搜了一下,有人说没有安装:Microsoft.AspNet.Mvc或者需要升级. 本次的解决如下: 1) ...
- C语言 · 还款计算
标题: 还款计算 银行贷款的等额本息还款方法是: 每月还固定的金额,在约定的期数内正好还完(最后一个月可能会有微小的零头出入). 比如说小明在银行贷款1万元.贷款年化利率为5%,贷款期限为24个月. ...