在理解进程之前我们先了解一下什么是进程的概念吧

以下就是我总结的一些基本的进程概念

进程就是正在运行的程序,它是操作系统中,资源分配的最小单位(通俗易懂点也就是电脑给程序分配的一定内存操作空间).
资源分配:分配的是cpu和内存等物理资源()
进程号是进程的唯一标识 (类似于身份证号,每个进程在运行的时候都有自己独特身份标识符)

同一个程序执行两次之后是两个进程(如python中我同时运行了两个py文件可以理解为我同时开了两个进程)
进程和进程之间的关系: 数据彼此隔离,通过socket通信

那么我们怎么获取当前的进程号呢?

·

Linux下我们可也通过命令行来查看相关的进程

ps -aux 可以查看当前在Linux下所有的进程

ps -aux |grep pycharm  查看pycharm的进程号

那么我们如何通过命令行来关闭相应的进程呢??

kill -9  进程号

在Windows下面直接在任务管理器右键关闭即可

进程号的基本获取

os.getpid()是获取当前程序的

os.getppid() 是获取当前程序的父类进程号

以上就是我对进程了解

下面我介绍下什么是并发以及并行

并发:一个cpu同一时间不停执行多个程序 (python里面进程中没有用到多并行,如果同一时间在python中运行多个进程的话会导致CPU处理变慢)
并行:多个cpu同一时间不停执行多个程序

CPU进程的调度方法

# 先来先服务fcfs(first come first server):先来的先执行
# 短作业优先算法:分配的cpu多,先把短的算完
# 时间片轮转算法:每一个任务就执行一个时间片的时间.然后就执行其他的.
# 多级反馈队列算法

越是时间长的,cpu分配的资源越短,优先级靠后
越是时间短的,cpu分配的资源越多

多级反馈算法的额静态图

如何在pycharm里面创建一个进程呢?

  首先我们要明白任何一个程序运行时计算机都需要为这个进程分配一定的资源,进程就是一个程序运行时的单位,默认一个程序只有一个进程,这个进程称为主进程

在当我们启动pycharm的时候就是一个进程,那么我们在这个软件下面所创建的任意一个py文件都是相对于pycharm的子进程那么下面我们通过代码实现以下进程的展示

###进程的查看
from multiprocessing import Process
import os

def func():
  print("1.子进程id>>>%s , 2.父进程id>>>%s" % (os.getpid(),os.getppid()))

#每个进程号都是有系统直接随机分配的

if __name__ == "__main__":
  print(os.getpid)#查看的是当前的主进程
  print(os.getppid)#查看的是当前的进程的父id进程号
 

  p = Process(target=func)
  # 调用子进程
  p.start()

 

由此我们可以得知所有的python文件都是一个子进程,在python文件里面创建的进程就是子进程

创建带有参数的子进程

方式一

# (2) 带有参数的函数任务
"""
Process 创建进程对象,参数要依靠args进行传递
args必须制定一个元素,参数和参数之间要用逗号进行分割
"""
def func(n):
for i in range(1,n+1):
print("1.子进程id>>>%s , 2.父进程id>>>%s" % (os.getpid(),os.getppid())) if __name__ == "__main__":
n = 5
# 创建子进程
p = Process(target=func,args=(n,))
# 调用子进程
p.start() for i in range(1,n+1):
print("*" * i)

# windows下开子进程必须在"main"下,因为在创建子进程时,会调用createprocess模块(会把父进程的内容导一遍,把父进程里面的数据完完整整的生成一份给子进程)
# 在linux系统下,不会有这个问题(两种系统造子进程的方式不一样)

p=Process(target=task,args=('子进程1',))
# 传参方式一:
# 因为导入的Process是一个类,所以需要实例化
# target:起的进程需要执行哪一段代码(这里指task)
# args:传参的方式,这里是一个元组(括号内需要加括号)

# p=Process(target=task,kwargs={'x':'任务1'})
# 传参方式二:
# kwargs:按照字典的方式进行传参,key是函数的参数'x',value是参数对应的值。

p.start()
# 给操作系统发信号,告诉操作系统有一个子进程要起来,让操作系统去申请内存空间,然后把父进程里面的数据拷贝一个给子进程,然后调用CPU来运行。
# 子进程被造出来后, 和父进程就没有任何关系,因为进程之间是隔离的
print('主进程')

方式二

from multiprocessing import Process
import time class MyProcess(Process):
def __init__(self,name):
super().__init__()
self.name=name def run(self):
print('%s is runing' %self.name)
time.sleep(3)
print('%s is done' %self.name) if __name__ == '__main__':
p=MyProcess('sudada')
p.start()
print('主进程') >>:主进程
>>:sudada is runing
>>:sudada is done

2.5、进程对象的join方法   (主进程在等待子进程运行完毕之后,在运行下一行代码 ( 而不是主进程先运行代码,等待子进程运行结束 ) )

在单个子进程下join的表现

def func():
print("发送第一封邮件") if __name__ == "__main__":
p = Process(target=func)
p.start()
# time.sleep(0.1)
# 必须等待子进程执行完毕之后,在执行下面的代码
p.join() print("发送第二封邮件")

join加在需要执行的子程序之后,等待子进程执行完之后才会走主进程

join升级之多个子进程同事并发

    print("发送%s个邮件" % (i))

if __name__ == "__main__":
lst = []
for i in range(10):
p = Process(target=func,args=(i,))
p.start()
# 从结果上达到目的,但是严重损坏了性能,速度下降
# p.join()
lst.append(p)
# print(lst) for i in lst:
i.join() print("主进程负责发送最后一封邮件 end ... ")

把每一个进程对象插入列表中,通过循环拿出一个个的进程对象
然后进程.join 执行阻塞,直到当前所有的子进程执行完毕,再去执行主进程最后的代码
如果直接把join放到for循环中,会导致进程创建时候,变成同步时候,严重影响性能速度;

默认程序在并发任务的时候,因为cpu调度策略,
不一定哪个进程先执行,哪个进程后执行,要参照哪个进程新变成就绪态,cpu就会优先执行
cpu遇到阻塞,就会立刻切换进程任务

主进程会在执行结束后,等所有子进程执行完毕,最后在关闭程序,释放资源
如果不等待子进程,子进程会在后台不停的占用资源,造成僵尸进程.
不方便对该进程进行管理,不知道该进程的来源,会导致维护困难;

在自定义的进程中程序也是有属于自己的name的默认第一个为

即当我有很多任务的时候我会把任务放到一个队列中,每个任务我给他 分配一定的时间处理,当我第一个队列中的某个任务执行完毕之后就会把剩余的任务丢到第二个队列中去,此时我的cup将对2级列表进行资源的分配,因为剩余的进程耗费的资源比较大那么此时我CPU分配给他们的资源也会更少依次类推,当我执行到最后一个队列时我此时的所存在的进程毫无疑问时所占的内存是最大的,那么如果我集中把资源全部分配到这个进程中的话势必会导致我其他的进程资源占用的少,从而导致我的CPU运行速度下降,所以在内存分配的静态图中我们可以得知内存占用越大的进程所获得的资源也就越少,从而提高了电脑的运行速度。

下面我们来看看进程执行是的状态图

(1)就绪态 (ready)

  只剩下CPU需要执行外,其他所有资源已分配完毕,称为就绪态

(2)执行(Running)状态

  cup开始执行该进程时称为执行态(也可以称为进程的执行状态)

(3)阻塞(Blocked)状态

  由于等待某个事件发生而无法执行时,便是阻塞状态,cpu执行其他进程.例如,等待I/O完成input、申请缓冲区不能满足等等。

python从入门到放弃之进程的更多相关文章

  1. python从入门到放弃之进程进阶篇

    什么我们得了解清楚什么是进程,进程就是系统分配的一个资源单位,真正在程序中干活得是线程,默认是每个进程中都拥有一个线程 然后我们在了解下什么是进程池这个概念 进程池是的数量是取决于我当前电脑的逻辑处理 ...

  2. python从入门到放弃之进程锁lock

    # ### lock (互斥锁)"""# 应用在多进程当中# 互斥锁lock : 互斥锁是进程间的get_ticket互相排斥进程之间,谁先抢占到资源,谁就先上锁,等到解 ...

  3. [Python 从入门到放弃] 6. 文件与异常(二)

    本章所用test.txt文件可以在( [Python 从入门到放弃] 6. 文件与异常(一))找到并自行创建 现在有个需求,对test.txt中的文本内容进行修改: (1)将期间的‘:’改为‘ sai ...

  4. [Python 从入门到放弃] 1. 列表的基本操作

    ''' 列表 Create By 阅后即焚 On 2018.1.29 ''' 1. 列表的定义 列表看起来好像其它编程语言中的数组,但列表具备更加强大的功能,它是Python完备的集合对象,现在,你可 ...

  5. Python 学习入门(23)—— 进程

    本文介绍Python的os包中有查询和修改进程信息的函数,Python的这些工具符合Linux系统的相关概念,所以可以帮助理解Linux体系. 1. 进程信息 os包中相关函数如下: uname()  ...

  6. Python从入门到放弃系列(Django/Flask/爬虫)

    第一篇 Django从入门到放弃 第二篇 Flask 第二篇 爬虫

  7. python从入门到放弃之守护进程

    # ### 守护进程 默认情况下,主进程要等待所有子进程执行完毕之后,才会关闭程序,释放资源守护进程进行在主进程代码执行结束之后,就直接关闭;守护进程守护的是主进程 语法: 进程.daemon = T ...

  8. Python从入门到放弃

    计算机基础 01 计算机基础之编程 02 计算机组成原理 03 计算机操作系统 04 编程语言分类 Python解释器 05 Python和Python解释器 06 执行Python程序的两种方式 0 ...

  9. [Python 从入门到放弃] 5. 文件与异常(一)

    1.文件操作: 文件操作包含读/写 从文件中读取数据 向文件写入数据 Python中内置了open()方法用于文件操作 (更多关于open()BIF介绍 阅读此篇) 基本模板: 1.获取文件对象 2. ...

随机推荐

  1. c++ 模板类,方法返回值类型是typedef出来的,或者是auto,那么此方法在类外面如何定义?

    c++ 模板类,方法返回值类型是typedef出来的,或者是auto,那么此方法在类外面如何定义? 比如方法max1的返回值是用typedef定义出来的mint,那么在类外如何定义这个方法呢? tem ...

  2. 软件工程基础团队第二次作业(团队项目-需求分析&系统设计)成绩汇总

    一.作业题目 团队第二次作业:需求分析&系统设计 二.具体要求 1.作业任务 任务一:组长组织项目组开展需求调研工作(可采取需求调查.问卷.分析已有软件.网上资料等方法).概要设计.详细设计. ...

  3. JVM垃圾回收GC

    1.堆的分代和区域 (年轻代)Young Generation(eden.s0.s1  space)    Minor GC (老年代)Old Generation (Tenured space)   ...

  4. Nginx企业级优化

    Nginx企业级优化 一.隐藏版本号信息 安装软件前修改,源码包中的版本信息 #切换到源码包目录[root@localhost ~]# cd /usr/src/nginx-1.15.9/[root@l ...

  5. CodeForces - 545CWoodcutters

    传送门 题目大意:n棵树(10^5),坐标xi,高度hi,把这棵树砍到,可以向右倒[xi,xi+hi]被占, 向左倒[xi-hi,xi]被占,必须要倒的坐标没有被占才能倒,不砍倒就xi被占,问最多砍几 ...

  6. day_0

    Day01 - 初识Python - Python简介 - Python的历史 / Python的优缺点 / Python的应用领域 - 搭建编程环境 - Windows环境 / Linux环境 / ...

  7. Word论文

    粘贴图片不完整,只显示一行? 问题:行距被固定了 临时解决:设置多倍行距,推荐值1.5 1. 点一下图片,然后选择样式-正文 即可, 2. 或者为图片创建专用样式,需要时就点一下: 开始-样式(点样式 ...

  8. 「ZJOI2019」浙江省选

    在八月来临前补完了zjoi2019 本来是想在八月前做完暑假作业的? 传送门 Description 给\(n\)条斜率为正的直线,询问每条直线是否在某处高度为前\(m\)名,如果是,询问最小排名 S ...

  9. Python连载22-调试&单元测试

    一.调试技术 (1)调试流程​:单元测试->集成测试->交测试部 (2)分类:i.静态调试(说白了就是看代码,看看有没有错):ii.动态测试 1.pdb调试 ​相关连接:https://b ...

  10. pandas使用大全--数据与处理

    1.首先导入pandas库,一般都会用到numpy库,所以我们先导入备用: import numpy as np import pandas as pd 导入CSV或者xlsx文件: df = pd. ...