Python全栈之进程和守护进程
作者:熬夜泡枸杞 发布时间:2021-11-25 18:05:44
标签:Python,进程,守护进程
目录
1. 理解进程
2. 进程的语法
3. join自定义进程类
4. 守护进程
总结
1. 理解进程
进程的概念:(process
)
进程就是正在运行的程序,它是操作系统中,资源分配的最小单位.
资源分配:分配的是cpu和内存等物理资源
进程号是进程的唯一标识
同一个程序执行两次之后是两个进程
进程和进程之间的关系: 数据彼此隔离,通过socket通信
并行和并发:
并发:一个cpu同一时间不停执行多个程序
并行:多个cpu同一时间不停执行多个程序
cpu的进程调度的方法:
# 先来先服务fcfs(first come first server):先来的先执行
# 短作业优先算法:分配的cpu多,先把短的算完
# 时间片轮转算法:每一个任务就执行一个时间片的时间.然后就执行其他的.
# 多级反馈队列算法
越是时间长的,cpu分配的资源越少,优先级靠后
越是时间短的,cpu分配的资源越多
1、2、3、4作业分别给0.4秒,1作业完成,2、3、4作业没有完成,会放到二级队列中,把后续短的作业放到一级队列。二级队列中的作业分别给0.3秒,2号作业完成,3、4号作业放到 * 队列,分别给0.2秒,3作业完成,4号没有完成,放到四号队列,给0.1秒进行处理,1号作业有可能是下载作业。
进程三状态图:
(1)就绪(Ready)状态
只剩下CPU需要执行外,其他所有资源都已分配完毕 称为就绪状态。
(2)执行(Running)状态
cpu开始执行该进程时称为执行状态。
(3)阻塞(Blocked)状态
由于等待某个事件发生而无法执行时,便是阻塞状态,cpu执行其他进程.例如,等待I/O完成input、申请缓冲区不能满足等等。
同步 异步 / 阻塞 非阻塞:
场景在多任务当中
同步:必须等我这件事干完了,你在干,只有一条主线,就是同步
异步:没等我这件事情干完,你就在干了,有两条主线,就是异步
阻塞:比如代码有了input,就是阻塞,必须要输入一个字符串,否则代码不往下执行
非阻塞:没有任何等待,正常代码往下执行.
# 同步阻塞 :效率低,cpu利用不充分
# 异步阻塞 :比如socketserver,可以同时连接多个,但是彼此都有recv
# 同步非阻塞:没有类似input的代码,从上到下执行.默认的正常情况代码
# 异步非阻塞:效率是最高的,cpu过度充分,过度发热 液冷
守护进程:
#可以给子进程贴上守护进程的名字,该进程会随着主进程代码执行完毕而结束(为主进程守护)
(1)守护进程会在主进程代码执行结束后就终止
(2)守护进程内无法再开启子进程,否则抛出异常(了解)
锁(Lock):
lock.acquire()# 上锁
lock.release()# 解锁
#同一时间允许一个进程上一把锁 就是Lock
加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改,即串行的修改,没错,速度是慢了,但牺牲速度却保证了数据安全。
#同一时间允许多个进程上多把锁 就是[信号量Semaphore]
信号量是锁的变形: 实际实现是 计数器 + 锁,同时允许多个进程上锁
# 互斥锁Lock : 互斥锁就是进程的互相排斥,谁先抢到资源,谁就上锁改资源内容,为了保证数据的同步性
# 注意:多个锁一起上,不开锁,会造成死锁.上锁和解锁是一对.
2. 进程的语法
# ### 进程 process
import os,time
"""
# ps -aux 查看进程号
# ps -aux | grep 2784 过滤查找2784这个进程
# 强制杀死进程
kill -9 进程号
# 获取当前进程号
res = os.getpid()
print(res)
# 获取当前进程的父进程
res = os.getppid()
print(res)
"""
from multiprocessing import Process
# (1) 进程的使用
"""
def func():
# 1.子进程id:3561,2.父进程id:3560
print("1.子进程id:{},2.父进程id:{}".format(os.getpid(),os.getppid()))
if __name__ == "__main__":
# 创建子进程 ,返回进程对象
p = Process(target=func)
# 调用子进程
p.start()
# 3.主进程id:3560,4.父进程id:3327
print("3.主进程id:{},4.父进程id:{}".format(os.getpid(),os.getppid()))
"""
# (2) 创建带有参数的进程
"""
def func(n):
time.sleep(1)
for i in range(1,n+1): # 0 ~ n-1
print(i)
print("1.子进程id:{},2.父进程id:{}".format(os.getpid(),os.getppid()))
if __name__ == "__main__":
n = 6
# target=指定任务 args = 参数元组
p = Process(target=func , args=(n,))
p.start()
for i in range(1,n+1):
print("*" * i)
"""
# (3) 进程之间的数据彼此隔离
"""
total = 100
def func():
global total
total +=1
print(total)
if __name__ == "__main__":
p = Process(target=func)
p.start()
time.sleep(1)
print(total)
"""
# (4) 进程之间的异步性
"""
1.多个进程之间是异步的并发程序,因为cpu调度策略问题,不一定先执行哪一个任务
默认来看,主进程执行速度稍快于子进程,因为子进程创建时,要分配空间资源可能会阻塞
阻塞态,cpu会立刻切换任务,以让程序整体的速度效率最大化
2.默认主进程要等待所有的子进程执行结束之后,在统一关闭程序,释放资源
若不等待,子进程可能不停的在系统的后台占用cpu和内存资源形成僵尸进程.
为了方便进程的管理,主进程默认等待子进程.在统一关闭程序;
"""
def func(n):
print("1.子进程id:{},2.父进程id:{}".format(os.getpid(),os.getppid()) , n )
if __name__ == "__main__":
for i in range(1,11):
p = Process(target=func,args=(i,))
p.start()
print("主进程执行结束了 ... " , os.getpid() )
3. join自定义进程类
子进程全部执行完,在执行主进程
# ### 1.同步主进程和子进程 : join
"""必须等待当前的这个子进程执行结束之后,再去执行下面的代码;,用来同步子父进程;"""
from multiprocessing import Process
import time
# (1) join 的基本使用
"""
def func():
print("发送第一封邮件 : 我的亲亲领导,你在么?")
if __name__ == "__main__":
p = Process(target=func)
p.start()
# time.sleep(0.1)
p.join()
print("发送第二封邮件 : 我想说,工资一个月给我涨到6万")
"""
# (2) 多进程场景中的join
"""
def func(i):
time.sleep(1)
print("发送第一封邮件{} : 我的亲亲领导,你在么?".format(i))
if __name__ == "__main__":
lst = []
for i in range(1,11):
p = Process(target=func,args=(i,))
p.start()
# join 写在里面会导致程序变成同步
lst.append(p)
# 把所有的进程对象都放在列表中,统一使用.join进行管理;
for i in lst:
i.join()
print("发送第二封邮件 : 我想说,工资一个月给我涨到6万")
"""
# ### 2使用自定义进程类,创建进程
# (1) 基本语法
import os
class MyProcess(Process):
def run(self):
print("1.子进程id:{},2.父进程id:{}".format(os.getpid(),os.getppid()))
if __name__ == "__main__":
p = MyProcess()
p.start()
# (2) 带有参数的自定义进程类
class MyProcess(Process):
def __init__(self,name):
# 手动调用一下父类的构造方法,完成系统成员的初始化;
super().__init__()
self.name = name
def run(self):
print("1.子进程id:{},2.父进程id:{}".format(os.getpid(),os.getppid()))
print(self.name)
if __name__ == "__main__":
p = MyProcess("我是参数")
p.start()
4. 守护进程
# ### 守护进程
"""
守护进程守护的是主进程,当主进程所有代码执行完毕之后,立刻强制杀死守护进程;
"""
from multiprocessing import Process
import time
# (1) 基本语法
"""
def func():
# time.sleep(1)
print("start... 当前的子进程")
print("end ... 当前的子进程")
if __name__ == "__main__":
p = Process(target=func)
# 在进程启动之前,设置守护进程
p.daemon = True
p.start()
print("主进程执行结束 ... ")
"""
# (2) 多个子进程的守护场景;
"""默认主进程等待所有非守护进程,也就是子进程执行结束之后,在关闭程序,释放资源
守护进程只要在主进程代码执行结束时,就会自动关闭;
"""
"""
def func1():
print("start ... func1 执行当前子进程 ... ")
print("end ... func1 结束当前子进程 ... ")
def func2():
count = 1
while True:
print("*" * count)
time.sleep(1)
count += 1
if __name__ == "__main__":
p1 = Process(target=func1)
p2 = Process(target=func2)
# 把p2这个进程变成守护进程;
p2.daemon = True
p1.start()
p2.start()
print("主进程执行结束 ... ")
"""
# (3) 守护进程用途: 监控报活
def alive():
while True:
print("3号服务器向总监控服务器发送报活信息: i am ok~")
time.sleep(1)
def func():
while True:
try:
print("3号服务器负责抗住3万用户量的并发访问...")
time.sleep(3)
# 主动抛出执行错误的异常,触发except分支
raise RuntimeError
except:
print("3号服务器扛不住了.. 快来修理我..")
break
if __name__ == "__main__":
p1 = Process(target=alive)
p2 = Process(target=func)
p1.daemon = True
p1.start()
p2.start()
# 必须等待p2这个子进程执行完毕之后,再放行主进程下面的代码
# 下面主进程代码执行结束,立刻杀死守护进程,失去了报活功能;
p2.join()
print("主进程执行结束 .... ")
#作业:
""" 使用多进程的方式 完成tcp服务端的并发 """
小提示:
在调用的时候触发装饰器
连续发包的时候才会粘包
容器不能转化成字节流,机器交互用json
文件对象是迭代器,迭代器返回的数据是一行行返回的
创建子进程的时候,要为其分配资源,处于堵塞状态,
会去执行下面的程序,这就是异步执行,两条主线
不刷新页面就能发文数据的技术叫ajax,是一种异步程序
进程是典型的异步程序
看一下super()这个函数
默认主进程走完了守护进程会立即被杀死,但是会等待子进程运行完毕
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!
来源:https://blog.csdn.net/weixin_46818279/article/details/121894398
0
投稿
猜你喜欢
- 当1980年Three Rivers公司第一次推出图形用户界面Perq,产生GUI这个概念的时候,不知道他们有没有想过今天图形界面设计竟然会
- 一、比较运算符和比较方法比较运算符用于判断是否相等和比较大小,Python中的比较运算符有==、!=、<、>、<=、>
- 系列最后一篇来说说Python中的类与对象,Python这门语言是无处不对象,如果你曾浅要了解过Python,你应该听过Python是一种面
- 本文从算法入手同时通过实例来讲解如何在SQL Server数据库中实现最优最简的整个过程。算法是计算机科学中一个重要的研究方向,是解决复杂问
- 一、概念1、模块化代码可以使代码易于维护和调试,并且提高代码的重用性;2、函数可以用来减少冗余的代码并提高代码的可重用性。函数也可以用来模块
- 区别IE6与FF:background:orange;*background:blue;区别IE6与IE7:background:green
- WordPress可以改造成twitter一样的微博网站,但是有一个坏处就是你要么用来做博客要么用来做微博,功能难兼得。相信大家在访问一些知
- 只有mdf文件的数据库附加失败的修复 附加时报如下错误: 服务器: 消息 1813,级别 16,状态 2,行 1 未能打开新数据库 '
- 本文中介绍的主要是SQL语句,请大家不要在Access中使用。SQL的分类:DDL—数据定义语言(CREATE,ALTE
- 本文实例讲述了Python使用当前时间、随机数产生一个唯一数字的方法。分享给大家供大家参考,具体如下:Python生成当前时间很简单,比Ja
- ISSET();——适合于检测是否存在这个参数。 定义和作用范围:用于测试一个变量是否具有值(包括0,FALSE,或者一个空字串,但不能是N
- 这次我主要讲解如何用Python基于Flask的登录和注册,验证方式采用Basic Auth 主要用以下库import os#Flask的基
- 前言最近将使用爬虫爬取的链接保存到 mysql 数据库中时,发现我将链接使用 json_encode 保存时候,在数据库中却显示了转义字符,
- 自己搭建IP数据库占资源,而且更新不便,何不使用现成的IP查询呢?下面自己写了个获取IP物理地址的PHP代码(有一定的瑕疵,请高手不吝赐教)
- 在 Go 语言中,map 是一种非常常见的数据类型,它可以用于快速地检索数据。Go 语言中的 map 与其他编程语言中的类似的数据类型相比,
- 关于段落<p></p>相信大家已经都在自己的工作中开始关注并应用了。因为那真的是非常简单的事,只要你愿意你随时都可以
- 以下示例显示如何在 XPath 查询中指定轴。这些示例中的 XPath 查询都在 SampleSchema1.xml 中所包含的映射架构上指
- 本期薯片会的目的是讨论人物角色在设计中如何应用的问题。围绕了以下几个问题开展了讨论:1、 角色能干什么?2、 包含哪
- 以下的文章主要是介绍SQL Server数据库与其实际应用元数据,我前两天在相关网站看见SQL Server数据库与其实际应用元数据的资料,
- 核心思想在defer出现的地方插入了指令CALL runtime.deferproc,在函数返回的地方插入了CALL runtime.def