1.进程:

  进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。我们自己在python文件中写了一些代码,这叫做程序,运行这个python文件的时候,这叫做进程。

  狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)

  广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。

  举例:比如py1文件中有个变量a=1,py2文件中有个变量a=2,他们两个会冲突吗?不会的,因为两个文件运行起来后是两个进程,操作系统让他们在内存上隔离开。

2.并发、并行:

  并发:是伪并行,即看起来是同时运行。单个cpu+多道技术就可以实现并发,(并行也属于并发)

  并行:并行:同时运行,只有具备多个cpu才能实现并行

3.同步/异步 与 阻塞和非阻塞:

  1.进程状态介绍:

    (1)就绪(Ready)状态:当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。

    (2)执行/运行(Running)状态当进程已获得处理机,其程序正在处理机上执行,此时的进程状态称为执行状态。

    (3)阻塞(Blocked)状态正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态。引起进程阻塞的事件可有多种,例如,等待I/O完成、申请缓冲区不能满足、等待信件(信号)等。

      事件请求:input、sleep、文件输入输出、recv、accept

      事件发生:sleep、input等完成了

      时间片到了之后有回到就绪状态,这三个状态不断的在转换

  2.同步/异步 与 阻塞和非阻塞:

  (1)同步阻塞形式:效率最低。拿上面的例子来说,就是你专心排队,什么别的事都不做。

  (2)异步阻塞形式:如果在排队取餐的人采用的是异步的方式去等待消息被触发(通知),也就是领了一张小纸条,假如在这段时间里他不能做其它的事情,就在那坐着等着,不能玩游戏等,那么很显然,这个人被阻塞在了这个等待的操作上面;

  (3)同步非阻塞形式:实际上是效率低下,想象一下你一边打着电话一边还需要抬头看到底队伍排到你了没有,如果把打电话和观察排队的位置看成是程序的两个操作的话,这个程序需要在这两种不同的行为之间来回的切换,效率可想而知是低下的。

  (4)异步非阻塞形式:效率更高,因为打电话是你(等待者)的事情,而通知你则是柜台(消息触发机制)的事情,程序没有在两种不同的操作中来回切换。

      如,这个人突然发觉自己烟瘾犯了,需要出去抽根烟,于是他告诉点餐员说,排到我这个号码的时候麻烦到外面通知我一下,那么他就没有被阻塞在这个等待的操作上面,自然这个就是异步+非阻塞的方式了。

4.multiprocessing模块(包)  Process模块:

  准确的说,multiprocess不是一个模块而是python中一个操作、管理进程的包。 之所以叫multi是取自multiple的多功能的意思,在这个包中几乎包含了和进程有关的所有子模块。

  process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建

Process类中参数的介绍:

  1 group参数未使用,值始终为None

  2 target表示调用对象,即子进程要执行的任务

  3 args表示调用对象的位置参数元组,args=(1,2,'egon',)

  4 kwargs表示调用对象的字典,kwargs={'name':'egon','age':18}

  5 name为子进程的名称

Process类中的方法介绍:

  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开启的进程

 import time
from multiprocessing import Process def func1(n,m):
print('我是func1')
print('我是%s'%n)
time.sleep(1)
print(m) def func2():
time.sleep(2)
print('我是func2') if __name__ == '__main__':
# target表示调用对象,即子进程要执行的任务
# args表示调用对象的位置参数元组,args = (1, 2,)
# kwargs表示调用对象的字典,kwargs={'name':'egon','age':18} # p1 = Process(target=func1,args=(10,20,))
p1 = Process(target=func1,kwargs={'n':10,'m':20})
p2 = Process(target=func2) p1.start()
p2.start()
print('主程序运行到这里了')
p1.join() # 阻塞,等待1号子程序运行结束
p2.join() # 等待2号子程序运行结束
print('主程序运行结束')

实例代码

5.进程的两种创建方法和隔离验证

  两种创建方法

 import time
from multiprocessing import Process def func1():
print('我是func1') # 直接创建
# p = Process(target=func1)
# p.start() # 面向对象方式创建
class MyProcess(Process): # 自定义对象创建进程必须继承Process父类
def __init__(self,n):
super().__init__() # super()拿到父类的__init__()避免重置父类
self.n = n def run(self): # 必须有run方法,没有虽不会报错,但父类run里是pass,不重写run则为空
time.sleep(2)
print(self.n) if __name__ == '__main__': # Windows下必须写这句 避免重复调用
p = MyProcess(10)
p.start() print('主进程结束')

进程之间的隔离验证

 import time
from multiprocessing import Process num = 100
def func():
global num
num = 66
print('我是func>>>',num) if __name__ == '__main__': # 所有的子进程异步执行
p_list = []
for i in range(10):
p = Process(target=func)
p.start()
p.join()
p_list.append(p) for pp in p_list:
pp.join() # 所有的子进程全部执行完之后,再执行主进程(主进程运行很快),值不一样则证明空间隔离 print('主程序num:',num)
print('主程序执行结束')

6.进程对象的其他方法了解:

  terminate,is_alive

 # 进程对象的其他方法一:terminate,is_alive
from multiprocessing import Process
import time class Piao(Process):
def __init__(self,name):
self.name=name
super().__init__() def run(self):
print('%s is 打飞机' %self.name)
# s = input('???') # 别忘了pycharm下子进程中不能input输入,会报错EOFError: EOF when reading a line,因为子进程中没有像我们主进程这样的在pycharm下的控制台可以输入东西的地方
time.sleep(2)
print('%s is 打飞机结束' %self.name) if __name__ == '__main__':
p1 = Piao('太白')
p1.start()
time.sleep(3)
p1.terminate() # 关闭进程,不会立即关闭,有个等着操作系统去关闭这个进程的时间,所以is_alive立刻查看的结果可能还是存活,但是稍微等一会,就被关掉了
print(p1.is_alive()) # 可能结果为True
print('等会。。。。')
time.sleep(1)
print(p1.is_alive()) # 结果一定为False

terminate,is_alive

  name pid

 from multiprocessing import Process
import time
import random class Piao(Process):
def __init__(self,name):
# self.name=name
# super().__init__() #Process的__init__方法会执行self.name=Piao-1,
# #所以加到这里,会覆盖我们的self.name=name # 为我们开启的进程设置名字的做法
super().__init__()
self.name=name def run(self):
print('%s is piaoing' %self.name)
time.sleep(random.randrange(1,3))
print('%s is piao end' %self.name) if __name__ == '__main__': p = Piao('egon')
p.start()
print('开始')
print(p.pid) # 查看pid
print(p.name) # 查看name

name pid

第三十天- 进程 Process模块 空间隔离的更多相关文章

  1. salesforce 零基础学习(三十六)通过Process Builder以及Apex代码实现锁定记录( Lock Record)

    上一篇内容是通过Process Builder和Approval Processes实现锁定记录的功能,有的时候,往往锁定一条记录需要很多的限制条件,如果通过Approval Processes的条件 ...

  2. 第三十篇:SOUI模块结构图及SOUI框架图

    模块结构图: SOUI框架图:

  3. salesforce 零基础学习(三十五) 通过Process Builder和Approval Processes锁定记录(Lock Record)

    有的时候我们可能有这样的需求,当某个字段为特定的值情况下,便锁定此条记录,仅允许Profile为System Admin的用户修改或者解锁,其他的用户只能查看此条记录,不能修改此条记录,这种情况下我们 ...

  4. Python之路(第三十六篇)并发编程:进程、同步异步、阻塞非阻塞

    一.理论基础 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所有内容都是围绕进程的概念展开的. 即使可以利用的cpu只有一个(早期的 ...

  5. python 全栈开发,Day38(在python程序中的进程操作,multiprocess.Process模块)

    昨日内容回顾 操作系统纸带打孔计算机批处理 —— 磁带 联机 脱机多道操作系统 —— 极大的提高了CPU的利用率 在计算机中 可以有超过一个进程 进程遇到IO的时候 切换给另外的进程使用CPU 数据隔 ...

  6. Node.js进程管理之Process模块

    在前面Node.js事件运行机制也有提到,Node.js应用在单个线程运行,但是现在大部分服务器都是多处理器,为了方便使用多个进程,Node.js提供了3个模块.Process模块提供了访问正在运行的 ...

  7. 在Python程序中的进程操作,multiprocess.Process模块

    在python程序中的进程操作 之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起 ...

  8. 孤荷凌寒自学python第三十五天python的文件操作之针对文件操作的os模块的相关内容

     孤荷凌寒自学python第三十五天python的文件操作之针对文件操作的os模块的相关内容 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.打开文件后,要务必记得关闭,所以一般的写法应当 ...

  9. 孤荷凌寒自学python第三十天python的datetime.datetime模块

     孤荷凌寒自学python第三十天python的datetime.datetime模块 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) datetime.datetime模块包含了:datet ...

随机推荐

  1. 解决 canvas 绘图在高清屏中的模糊问题

    解决 canvas 绘图在高清屏中的模糊问题 为什么模糊 CSS 像素是一个抽象单位(1 px),浏览器根据某种规则将 css 像素转化为屏幕需要的实际像素值. 在高清屏之前,屏幕上显示一个像素点需要 ...

  2. ssm中返回中文字符串时出现乱码?

    问题:返回json格式时,前端ajax请求,响应数据接收正常:     返回String时,响应数据是乱码? 解决:@RequestMapping注解中添加:produces = "text ...

  3. postgresql-pg_prewarm数据预加载。

    pg_prewarm数据预加载. http://francs3.blog.163.com/blog/static/405767272014419114519709/   https://www.kan ...

  4. 初识java java的加载与执行(JDK,JVM,JRE关系解释)

    首先java代码是以 .java结尾的文件,通过javac命令编译生成.class编译生成字节码文件,再通过java命令,把字节码文件加载到内存内部,此时是类加载器ClassLoader执行加载,通过 ...

  5. POJ 2612

    #include<iostream> #include<stdio.h> #include<algorithm> #define MAXN 11 using nam ...

  6. 09-02 java 多态

    多态的前提.多态的特点 /* 多态:同一个对象(事物),在不同时刻体现出来的不同状态. 举例: 猫是猫,猫是动物. 水(液体,固体,气态). 多态的前提: A:要有继承关系. B:要有方法重写. 其实 ...

  7. (转)Linux top命令的用法详细详解

    原文:https://yq.aliyun.com/articles/399004?spm=a2c4e.11153940.blogcont399002.9.3a19f00aHOA3SH# 摘要: 首先介 ...

  8. fastjson的JSONArray转化为泛型列表

    背景:一个复杂结构体内部可能有array的数据,例如:{name:"test",cities:[{name:"shanghai",area:1,code:200 ...

  9. 全网最详细的CentOS7里如何安装MySQL(得改为替换安装MariaDB)(图文详解)

    不多说,直接上干货! 直接yum install mysql的话会报错,原因在于yum安装库里没有直接可以用的安装包,此时需要用到MariaDB了,MariaDB是MySQL社区开发的分支,也是一个增 ...

  10. sublime自动对齐Alignment插件快捷键

    [ { "keys": ["ctrl+alt+f"], "command": "alignment" } ]