我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python全栈之进程和守护进程

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python全栈之进程和守护进程

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()这个函数
默认主进程走完了守护进程会立即被杀死,但是会等待子进程运行完毕

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python全栈之进程和守护进程

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python全栈的进程和守护进程是怎样的

这期内容当中小编将会给大家带来有关Python全栈的进程和守护进程是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1. 理解进程进程的概念:(process)进程就是正在运行的程序,它是操作系统中,
2023-06-22

Python 守护进程

nohup 可以使程序后台运行不受终端影响,但想使程序运行后就脱离终端Python需要用到os.fork来实现,例子如下:daemonize.py#!/usr/bin/python #coding:utf-8  import sys imp
2023-01-31

python守护进程

假如写一段服务端程序,如果ctrl+c退出或者关闭终端,那么服务端程序就会退出,于是就想着让这个程序成为守护进程,像httpd一样,一直在后端运行,不会受终端影响。守护进程英文为daemon,像httpd,mysqld,最后一个字母d其实就
2023-01-31

python 守护进程(daemon)

守护进程的编写步骤:1、fork子进程,然后父进程退出,此时子进程会被init进程接管。2、修改子进程的工作目录,创建新进程组合新会话,修改umask。3、子进程再次fork一个进程,这个进程可以称为孙子进程,然后子进程退出。4、重定向孙子
2023-01-31

[转]Python 守护进程

守护进程:通常被定义为一个后台进程,而且它不属于任何一个终端会话(terminal session)。许多系统服务由守护程序实施;如网络服务,打印等。  下面是转自一位网友写的编写守护进程的步骤: 1. 调用fork()以便父进程可
2023-01-31

Python setdaemon守护进程

setdaemon守护进程#_*_coding:utf-8_*___author__ = 'gaogd'import timeimport threading'''守护进程,如果主线程down了,子线程也就没有了。下面先通过主进程生成mai
2023-01-31

linux 守护进程详解及建立守护进程

linux 守护进程详解及建立守护进程 守护进程是一种后台运行并且独立于所有终端控制之外的进程。守护进程的启动要启动一个守护进程,可以采取一下几种方式:在系统期间通过系统的初始化脚本启动守护进程。这些脚本通常在目录etc/rc.d下,通过它
2022-06-04

Python守护进程daemon实现

1.1 守护进程守护进程是系统中生存期较长的一种进程,常常在系统引导装入时启动,在系统关闭时终止,没有控制终端,在后台运行。守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程也不会被任何终端所产生的终端信息所打断。在
2023-01-31

如何进行Python进程的守护进程实施

如何进行Python进程的守护进程实施,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Python进程这一计算机语言在实际的应用中,如果你在实际应用的过程中遇到相
2023-06-17

python daemon守护进程实现

假如写一段服务端程序,如果ctrl+c退出或者关闭终端,那么服务端程序就会退出,于是就想着让这个程序成为守护进程,像httpd一样,一直在后端运行,不会受终端影响。 守护进程英文为daemon,像httpd,mysqld,最后一个字母d其实
2022-06-04

Python实现Daemon(守护)进程

最近在写Daemon进程,在编写过程中遇到一些小麻烦,最终还是解决了。我编写了两种,第一种是编写了一个程序,将其用setsid命令让其放入后台运行,第二种是直接fork()一个进程,在代码里将进程设置为后台启动。在os.sytem()函数其
2023-01-31

python守护进程监控子进程怎么实现

在Python中,可以使用multiprocessing模块来创建子进程并监控它们。具体实现方法如下:导入multiprocessing模块。import multiprocessing创建一个子进程的函数。def child_proces
2023-10-23

python中的daemon守护进程实现

守护进程是生存期长的一种进程。它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。他们常常在系统引导装入时启动,在系统关闭时终止。守护进程的特性1.在后台运行2.与其运行前的环境隔离开来。这些环境包括未关闭的文件描述符、控制
2023-01-31

Python模块整理(六):守护进程

守护进程三个特征:在后台运行,与启动它的进程脱离,无须控制终端。>>> def run(program, *args):...     pid = os.fork()...     if pid==0:#pid==0为在子进程内 在子进程内
2023-01-31

Python守护进程和脚本单例运行详解

本篇文章主要介绍了Python守护进程和脚本单例运行,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧一、简介守护进程最重要的特性是后台运行;它必须与其运行前的环境隔离开来,这些环境包括未关闭的文件描述符、控制终端
2022-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录