进程,join的使用,守护进程---day30
1.进程
# ### 进程
import os,time #当前进程id(子进程)
res = os.getpid()
print(res) #1772 #当前进程id(父进程)
res = os.getppid
print(res) #1772 #(1) 进程的基本语法
from multiprocessing import Process #先导入这个模块
'''
process 创建子进程,返回进程的对象p
target 指定要执行的任务 #后面接函数名
args 指定传递的参数,args的类似时元组,多个参数之间用逗号隔开
'''
def func():
print("1.子进程id>>>>{} , 2.父进程id>>>>{}".format(os.getpid(),os.getppid())) #windows里面下面这句话必须要加:
if __name__ == '__main__':
print("3.子进程id>>>>{} , 4.父进程id>>>>{}".format(os.getpid(),os.getppid())) #创建子进程,返回一个进程对象,执行func任务
p = Process(target=func) #target指定任务
#调用子进程
p.start()
'''
3.子进程id>>>>1640 , 4.父进程id>>>>6952
1.子进程id>>>>6636 , 2.父进程id>>>>1640
''' #(2) 创建带有参数的过程
def func(n):
for i in range(1,n+1):
print("3.子进程id>>>>{} , 4.父进程id>>>>{}".format(os.getpid(),os.getppid())) if __name__ == '__main__':
print("1.子进程id>>>>{} , 2.父进程id>>>>{}".format(os.getpid(),os.getppid()))
n = 5
#创建子进程
p = Process(target=func,args=(n,))
#调用子进程
p.start() for i in range(1,n+1):
print('*' * i)
#当程序运行到创建子进程的时候,创建空间会阻塞,然后就会先运行下面的for循环
#等到创建子进程变成就绪的时候再回去执行创建子进程的程序
'''
运行结果:
1.子进程id>>>>4556 , 2.父进程id>>>>6952
*
**
***
****
*****
3.子进程id>>>>5276 , 4.父进程id>>>>4556
3.子进程id>>>>5276 , 4.父进程id>>>>4556
3.子进程id>>>>5276 , 4.父进程id>>>>4556
3.子进程id>>>>5276 , 4.父进程id>>>>4556
3.子进程id>>>>5276 , 4.父进程id>>>>4556
''' #(3) 进程之间的数据隔离
count = 100
def func():
global count
count += 1
print('我是子进程count={}'.format(count)) if __name__ == '__main__':
p = Process(target=func)
p.start()
time.sleep(1)
print(count)
'''
运行结果:
我是子进程count=101
100
说明子进程和主进程之间的数据是隔离的
''' #(4) 多个进程可以异步并发,子父进程之间的关系
'''
程序在异步并发任务时,因为cpu调度策略问题,不一定先执行谁或者后执行谁
整体而言,主进程速度快于子进程,cpu遇到阻塞立刻切换其他任务,等到进程的就绪状态在切换回来 #主进程会默认等到所有的子进程执行结束之后,再关闭程序,释放资源
若不等待,子进程并不方便管理,容易造成僵尸进程,在后台不停的占用资源(cpu和内存),不清楚进程的来源
'''
def func(args):
print("3.子进程id>>>>{} , 4.父进程id>>>>{}".format(os.getpid(),os.getppid()) , args) if __name__ == '__main__':
for i in range(1,11):
Process(target=func,args=(i,)).start() print('主程序执行结束...')
'''
运行结果: 执行顺序每次都不一样
3.子进程id>>>>4512 , 4.父进程id>>>>6796 3
3.子进程id>>>>5300 , 4.父进程id>>>>6796 2
3.子进程id>>>>1712 , 4.父进程id>>>>6796 4
主程序执行结束...
3.子进程id>>>>6644 , 4.父进程id>>>>6796 7
3.子进程id>>>>4636 , 4.父进程id>>>>6796 6
3.子进程id>>>>7120 , 4.父进程id>>>>6796 5
3.子进程id>>>>5732 , 4.父进程id>>>>6796 1
3.子进程id>>>>1952 , 4.父进程id>>>>6796 8
3.子进程id>>>>6728 , 4.父进程id>>>>6796 10
3.子进程id>>>>4632 , 4.父进程id>>>>6796 9
'''
2.join
# ### 1.join 等待所有子进程全部执行完毕之后,主进程任务在继续执行(用来同步子父进程速度的) from multiprocessing import Process
import os #(1) join的基本语法
def func():
print('发送第一封邮件') if __name__ == '__main__':
p = Process(target=func)
p.start() #必须等到子进程结束之后再继续执行主程序的代码,用来同步代码的一致性
p.join()
print('发送第二封邮件')
'''
运行结果:
发送第一封邮件
发送第二封邮件
'''
#(2) 多个子进程配合join使用
def func(index):
print('发送第%s封邮件'%(index)) if __name__ == '__main__':
lst = []
for i in range(10):
p = Process(target=func,args=(i,))
p.start()
lst.append(p)
#p.join() #在这边加join时,程序会变成同步阻塞减慢速度 for i in lst:
print(i)
i.join()
print('主进程发最后一封邮件,里面的内容是我发完了')
'''
运行结果:
发送第1封邮件
发送第2封邮件
发送第0封邮件
发送第4封邮件
发送第5封邮件
发送第3封邮件
发送第6封邮件
<Process(Process-1, stopped)>
<Process(Process-2, stopped)>
<Process(Process-3, stopped)>
<Process(Process-4, started)>
<Process(Process-5, stopped)>
<Process(Process-6, stopped)>
<Process(Process-7, started)>
<Process(Process-8, started)>
发送第8封邮件
发送第7封邮件
<Process(Process-9, stopped)>
<Process(Process-10, started)>
发送第9封邮件
主进程发最后一封邮件,里面的内容是我发完了
''' # ### 使用自定义类的方式创建进程(拓展)
'''
自定义类创建进程要求:
(1) 必须继承Process这个父类
(2) 所有进程执行任务的逻辑要写run方法里面
''' #(1) 基本语法
class MyProcess(Process):
def run(self):
print("1.子进程id>>>>{} , 2.父进程id>>>>{}".format(os.getpid(),os.getppid())) if __name__ == '__main__':
p = MyProcess()
p.start()
print("3.子进程id>>>>{} , 4.父进程id>>>>{}".format(os.getpid(),os.getppid()))
'''
运行结果
3.子进程id>>>>4976 , 4.父进程id>>>>6952
1.子进程id>>>>484 , 2.父进程id>>>>4976
''' #(2) 有参数的进程函数
class MyProcess(Process): def __init__(self,arg):
#手动调用一下父类的构造方法(实现进程的创建)
super().__init__()
self.arg = arg def run(self):
print("1.子进程id>>>>{} , 2.父进程id>>>>{}".format(os.getpid(),os.getppid()),self.arg) if __name__ == '__main__':
p = MyProcess('我是参数')
p.start()
print("3.子进程id>>>>{} , 4.父进程id>>>>{}".format(os.getpid(),os.getppid()))
运行结果:
3.子进程id>>>>1412 , 4.父进程id>>>>6952
1.子进程id>>>>2140 , 2.父进程id>>>>1412 我是参数
3.守护进程
# ### 守护进程
'''
守护进程守护的是主进程,如果主进程执行结束了,意味着守护进程的寿命立刻终止,立刻杀死
语法:
进程.daemon = True 设置当前进程为守护进程
必须写在start()调用进程之前进行设置 默认情况下,主进程会等待所有子进程执行完毕之后,关闭程序,释放资源
守护进程在主进程代码执行结束之后,直接杀掉
'''
from multiprocessing import Process
#(1) 基本语法
def func():
print('start 当前子进程')
print('end 当前子进程') if __name__ == '__main__':
p = Process(target=func)
p.daemon = True
p.start()
print('主进程执行结束...')
'''
运行结果:
主进程执行结束...
#首先开辟子进程空间的时候会阻塞,然后就先执行主程序执行结束,
#一旦主程序执行结束就表示剩下的全部杀掉不执行
''' #(2) 多个子进程的场景
import time
def func1():
count = 1
while True:
print('*'*count)
time.sleep(0.5)
count += 1 def func2():
print('start func2当前子进程')
time.sleep(2)
print('end func2当前子进程') if __name__ == '__main__':
p1 = Process(target=func1)
p2 = Process(target=func2) #设置当前进程为守护进程
p1.daemon =True
p1.start()
p2.start() time.sleep(1)
#非守护进程,主进程还是会默认等待的
print('主程序代码结束')
'''
运行结果
*
start func2当前子进程
**
主程序代码结束...
end func2当前子进程
p1和p2都会创建子进程空间,然后运行p1和p2子进程中的程序
然后因为开辟空间的时候会有阻塞,因为不会等到p1和p2全部执行结束后才去执行主程序
此时执行主程序,主程序和p1绑定为守护程序,所以主程序执行完毕就表示p1要全部结束
此时p2在前面睡了2秒,正好p1和主程序都结束了,然后执行p2
''' #(3) 守护进程的实际用途:监控报活
import time
#监控报活
def alive():
while True:
print("给监控服务器发消息, 当前5号服务器功能正常 i am ok ~")
time.sleep(1)
#当前服务器正常完成的功能
def func():
#while True:
time.sleep(5)
print("当前5号服务器功能,统计财务报表~") if __name__ == '__main__':
p1 = Process(target=func)
p2 = Process(target=alive)
p2.daemon = True p1.start()
p2.start() #等待p1子进程执行结束之后,下面的主程序的代码才会执行
p1.join()
print('当前服务器状态:统计账务报表功能异常...')
运行结果:
给监控服务器发消息, 当前5号服务器功能正常 i am ok ~
给监控服务器发消息, 当前5号服务器功能正常 i am ok ~
给监控服务器发消息, 当前5号服务器功能正常 i am ok ~
给监控服务器发消息, 当前5号服务器功能正常 i am ok ~
给监控服务器发消息, 当前5号服务器功能正常 i am ok ~
当前5号服务器功能,统计财务报表~
给监控服务器发消息, 当前5号服务器功能正常 i am ok ~
当前服务器状态:统计财务报表功能异常...
解析:首先p1p2子进程开辟空间,然后执行对应的程序,因为p1对象用了join,必须要等p1子进程结束
之后才能执行下面的主程序代码,当主程序代码执行结束后,因p2是守护进程,所以此时的p2的所有
进程都要全部杀掉。
进程,join的使用,守护进程---day30的更多相关文章
- python并发编程02 /多进程、进程的创建、进程PID、join方法、进程对象属性、守护进程
python并发编程02 /多进程.进程的创建.进程PID.join方法.进程对象属性.守护进程 目录 python并发编程02 /多进程.进程的创建.进程PID.join方法.进程对象属性.守护进程 ...
- Linux 守护进程二(激活守护进程)
//守护进程--读文件 #include <stdio.h> #include <stdlib.h> #include <string.h> #include &l ...
- 【LINUX】主进程、父进程、子进程、守护进程的概念
一.摘要 详解父进程.子进程.守护进程的区别,例子稍候补充 二.定义区别 主进程 程序执行的入口,可以理解为常用的main 函数 父进程 对于子进程而言, 子进程的创造者,可有多个子进程. 任何进程都 ...
- 1.2 Linux中的进程 --- fork、vfork、exec函数族、进程退出方式、守护进程等分析
fork和vfork分析: 在fork还没有实现copy on write之前,Unix设计者很关心fork之后立即执行exec所造成的地址空间浪费,也就是拷贝进程地址空间时的效率问题,所以引入vfo ...
- linux分享一:进程全攻略--守护进程(服务)
概括: 进程是程序的运行实例.进程对应一个唯一的进程PID, 统一程序的多个实例可以同时运行,他们的pid互不相同. 进程一般分为交互进程.批处理进程和守护进程(daemons)三类 一:什么是守护进 ...
- linux 进程组和会话 守护进程
这两个概念的产生,是为了shell更好的管理作业,管理其创建的子进程 对其进行暂停,终止 执行命令,命令之间有时还需要管道进行通信 进程组是进程的合集 会话是进程组的合集 一个会话共用一个控制终端,也 ...
- python网络编程--线程join和Daemon(守护进程)
一:什么情况下使用join join([timeout])调用join函数会使得主调线程阻塞,直到被调用线程运行结束或超时. 参数timeout是一个数值类型,用来表示超时时间,如果未提供该参数,那么 ...
- Day9 进程理论 开启进程的两种方式 多进程实现并发套接字 join方法 Process对象的其他属性或者方法 守护进程 操作系统介绍
操作系统简介(转自林海峰老师博客介绍) #一 操作系统的作用: 1:隐藏丑陋复杂的硬件接口,提供良好的抽象接口 2:管理.调度进程,并且将多个进程对硬件的竞争变得有序 #二 多道技术: 1.产生背景: ...
- 进程Process之join、daemon(守护)、terminate(关闭)、multiprocessing之锁、信号量和事件
一.Process 参数介绍: 1 group参数未使用,值始终为None 2 target表示调用对象,即子进程要执行的任务 3 args表示调用对象的位置参数元组,args=(1,2,'a',) ...
- Python之路(第三十七篇)并发编程:进程、multiprocess模块、创建进程方式、join()、守护进程
一.在python程序中的进程操作 之前已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起来的python程序 ...
随机推荐
- [转帖]深入理解mysql-第十二章 mysql查询优化-Explain 详解(下)
我们前面两章详解了Explain的各个属性,我们看到的都是mysql已经生成的执行计划,那这个执行计划的是如何生成的?我们能看到一些过程指标数据吗?实际mysql贴心为我们提供了执行计划的各项成本评估 ...
- [转帖]SYSTEMD 配置文件
https://www.cnblogs.com/xiexun/p/13643952.html [Unit]区块通常是配置文件的第一个区块,用来定义 Unit 的元数据,以及配置与其他 Unit 的关系 ...
- Linux下PG数据库计划任务定期备份恢复的方法
注意事项 PG数据库需要注意的一点是需要安装OSSP-UUID的组件才能使用. 本次使用最除了冷备之外 最简单的 pg_dump和pg_restore的操作 的方式来进行处理 务必定期演练保证数据备份 ...
- 基于Apache PDFBox的PDF数字签名
在Java语言环境中完成数字签名主要基于itext-pdf.PDFBox两种工具,itext-pdf受商业限制,应用于商业服务中需要购买授权.PDFBox是apache基金会开源项目,基于apache ...
- 浅谈kafka
作者:京东科技 徐拥 入门 1.什么是kafka? apache Kafka is a distributed streaming platform. What exactly dose that m ...
- 【K哥爬虫普法】孤注一掷的爬虫er,究竟还要误入歧途多远?
我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K 哥特设了"K哥爬虫普法"专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识, ...
- FMEA:总监和架构师都在用的高可用架构分析方法
FMEA:总监和架构师都在用的高可用架构分析方法 记得之前准备春晚项目的时候,团队成员在一起过架构,老板最常问的问题是"这个组件挂了怎么办?有什么影响?",我当时还在心里默默嘀咕: ...
- NLP领域任务如何选择合适预训练模型以及选择合适的方案【规范建议】【ERNIE模型首选】
1.常见NLP任务 信息抽取:从给定文本中抽取重要的信息,比如时间.地点.人物.事件.原因.结果.数字.日期.货币.专有名词等等.通俗说来,就是要了解谁在什么时候.什么原因.对谁.做了什么事.有什么结 ...
- 699元 光威推出神武RGB系列DDR5 6400内存:海力士精选颗粒
光威推出了神武RGB系列DDR5 6400台式机内存条,售价为699元. 据了解,新款内存条采用了海力士M-die特挑颗粒,拥有CL-32-39-39-102低时序. 散热方面,这款内存条采用显卡级散 ...
- XPath从入门到精通:基础和高级用法完整指南,附美团APP匹配示例
XPath 通常用来进行网站.XML (APP )和数据挖掘,通过元素和属性的方式来获取指定的节点,然后抓取需要的信息. 学习 XPath 语法之前,首先了解一下一些概念. 概念介绍 节点之间的关系 ...