进程part1

很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:101677771

一、进程介绍

进程就是正在运行的程序,它是操作系统中,资源分配的最小单位
资源分配:分配的是cpu和内存等物理资源,进程号是进程的唯一标识
获取当前进程–子进程
异步和同步:

1、获取子父进程

os.getpid()

获取当前进程的父进程

os.getppid()

为解决Windows系统和Linux系统的兼容问题,下面这句话必须加上:
__name__ == “__main__”

def func():
res1=os.getpid()
res2=os.getppid()
print(res1,res2)
#创建子进程,返回进程对象,执行func这个任务
if __name__ == "__main__":
P=Process(target=func)
P.start()

运行结果:

2、进程的基本使用

引用multiprocessing模块来创建以一个进程:

from multiprocessing import Process
import os
def func():
print("子进程为>>{},父进程为>>{}".format(os.getpid(),os.getppid()))
#为解决系统兼容性问题,必须加下面这句话
if __name__ == "__main__":
#创建子进程,返回进程对象,执行func这个任务
p=Process(target=func)
#调用子进程
p.start()

运行结果:

2、创建带有参数的进程

在进程对象的创建处使用args进行传参

from multiprocessing import Process
import os
def func(m,n):
print("子进程为>>{},父进程为>>{}".format(m,n))
#为解决系统兼容性问题,必须加下面这句话
if __name__ == "__main__":
#创建子进程,返回进程对象,执行func这个任务
p=Process(target=func,args=(os.getpid(),os.getppid()))
#调用子进程
p.start()

运行结果:

3、进程之间的数据彼此隔离

from multiprocessing  import Process
import time
count=0
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的操作没有影响到主进程

4、多个进程之间的异步并发

多个进程之间是异步并发的程序,因为cpu的调度策略问题,不一定哪个程序先执行,哪个程序后执行
整体而言,主进程比子进程创建的速度要快,cpu遇到阻塞会立即切换任务,等到阻塞态的任务变成了就绪态,cpu再回来执行
主程序会默认等到所有子程序执行结束之后,再统一关闭程序,释放资源
若不等待,有可能在后台存有多个未执行结束的子进程,会变成僵尸进程,不停的占用cpu和内存。

import time,random,os
from multiprocessing import Process
def func(n):
time.sleep(random.randrange(3))
print("{},子进程:{},父进程:{}".format(n,os.getpid(),os.getppid()))
if __name__ == "__main__":
for i in range(10):
p=Process(target=func,args=(i,))
p.start()
print("主程序结束了")
print(os.getpid())

运行结果:

如图,因为多个进程之间是异步并发的,所以会产生以上结果

二、join

等待当前子进程全部执行完毕后,主进程再进行执行

1、基本语法

import os,time
from multiprocessing import Process
def func1():
print("子进程:{}".format(os.getpid()))
def func2():
time.sleep(0.5)
print("父进程:{}".format(os.getppid()))
if __name__ == "__main__":
p1=Process(target=func1)
p2=Process(target=func2)
p1.start()
p2.start()
#引入join,所有子进程执行完成后执行主进程
p1.join()
p2.join()
print("主进程执行完毕")

运行结果:

2、使用自定义类的方法创建进程

自定义进程类的要求:

  • 必须继承Process这个父类
  • 所有进程执行任务的逻辑必须写在run方法里面

基本写法:

import os,time
from multiprocessing import Process
class MyProcess(Process):
def run(self):
print("子进程:{},父进程:{}".format(os.getpid(),os.getppid()))
if __name__ == "__main__":
p=MyProcess()
p.start()
p.join()
print("主进程执行结束")

带有参数自定义类的方法:

import os,time
from multiprocessing import Process
class MyProcess(Process):
def __init__(self,arg):
self.arg=arg
super().__init__()
def run(self):
print(self.arg)
print("子进程:{} 主进程:{}".format(os.getpid(),os.getppid()))
if __name__=="__main__":
p=MyProcess(arg="我是传参")
p.start()
p.join()
print("主进程执行结束")

运行结果:

三、守护进程

守护进程守护的是主进程,如果主进程中的所有代码执行完毕了,当前这个守护进程会被立刻杀死,立即终止。

语法:
进程.daemon = True 设置当前这个进程为守护进程
必须在start()调用进程之前进行设置

默认:主进程会等待所有子进程执行结束后,再关闭程序,释放资源

from multiprocessing import Process
import time
def func1():
while True:
time.sleep(0.5)
print("我是守护进程!")
def func2():
time.sleep(3)
print("我是子进程!")
if __name__ == "__main__":
p1=Process(target=func1)
p2=Process(target=func2)
p1.daemon=True
p1.start()
p2.start()
time.sleep(2)
print("主进程执行")

运行结果:

案例:
监控报活: 利用守护进程特性,监控日志分析服务器是否存活

from multiprocessing import Process
import time
def alive():
while True:
time.sleep(0.5)
print("P1:服务器存活...")
def func():
count=0
while True:
try:
time.sleep(0.5)
print("P2:服务器日志分析中...")
time.sleep(1)
count += 1
if count == 3:
raise RuntimeError
except:
break
if __name__ == "__main__":
p1=Process(target=alive)
p2=Process(target=func)
p1.daemon=True
p1.start()
p2.start()
p2.join()
print("服务器出现异常!")

运行结果:

Python编程进阶,Python如何实现多进程?的更多相关文章

  1. python编程(python开发的三种运行模式)【转】

    转自:http://blog.csdn.net/feixiaoxing/article/details/53980886 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 单循环 ...

  2. Python编程系列---Python中装饰器的几种形式及万能装饰器

    根据函数是否传参  是否有返回值 ,可以分析出装饰器的四种形式: 形式一:无参无返回值 def outer(func): def wrapper(): print("装饰器功能1" ...

  3. 年薪20万Python工程师进阶(7):Python资源大全,让你相见恨晚的Python库

    我是 环境管理 管理 Python 版本和环境的工具 pyenv – 简单的 Python 版本管理工具. Vex – 可以在虚拟环境中执行命令. virtualenv – 创建独立 Python 环 ...

  4. Python编程:从入门到实践(选记)

    本文参考< Python 编程:从入门到实践>一书,作者: [ 美 ] Eric Matthes 第1章 起步 1.1     搭建python环境 在不同的操作系统中, Python 存 ...

  5. Python学习手册之 Python 之禅、Python 编程规范和函数参数

    在上一篇文章中,我们介绍了 Python 的正则表达式使用示例,现在我们介绍 Python 之禅. Python 编程规范和函数参数.查看上一篇文章请点击:https://www.cnblogs.co ...

  6. 学Python编程能做什么工作?从事什么岗位?——这些问题你知道吗?

    前言 学Python编程能做什么工作?随着人工智能发展,学习python语言的人员有更多的岗位机会,python从事的职业广泛,从游戏到AI人工智能能都可以用Python实现.除了编程,各种岗位的人都 ...

  7. 进击的Python【第七章】:Python的高级应用(四)面向对象编程进阶

    Python的高级应用(三)面向对象编程进阶 本章学习要点: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 一.面向对象高级语法部分 静态方法 ...

  8. Python之路,Day8 - Socket编程进阶

    Python之路,Day8 - Socket编程进阶   本节内容: Socket语法及相关 SocketServer实现多并发 Socket语法及相关 socket概念 socket本质上就是在2台 ...

  9. Day7 - Python基础7 面向对象编程进阶

    Python之路,Day7 - 面向对象编程进阶   本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个 ...

随机推荐

  1. 唯一约束 UNIQUE KEY

    目录 什么是唯一约束 与主键的区别 创建唯一约束 唯一性验证 什么是唯一约束 Unique Key:它是 MySQL 中的唯一约束,是指在所有记录中字段的值不能重复出现.例如,为 id 字段加上唯一性 ...

  2. 云小课 | IPv4枯了,IPv6来了

    摘要:本篇主要分享IPv4与IPv6的区别和IPv6的应用场景,助您快速理解华为云IPv6双栈及IPv6 EIP. IPv6的由来 上节课我们讲了公网IP与私网IP,了解了IP地址的一些知识. 我们一 ...

  3. 深入学习JDK源码系列之、ArrayList

    前言 JDK源码解析系列文章,都是基于JDK8分析的,虽然JDK15马上要出来了,但是JDK8我还不会,我... 类图 实现了RandomAccess接口,可以随机访问 实现了Cloneable接口, ...

  4. 数据结构进阶:ST表

    简介 ST 表是用于解决 可重复贡献问题 的数据结构. 什么是可重复贡献问题? ​ 可重复贡献问题 是指对于运算 \(\operatorname{opt}\) ,满足 \(x\operatorname ...

  5. 使用Spock 单元测试

    一.什么是Spock Spock 是一个测试框架,甚至可以说是一门语言他是基于Groovy开发的.它的语法完全遵循 BDD(行为驱动开发) 风格的结构.它是基于 Junit test runner 上 ...

  6. Java 图书管理项目

    思路总结: 1.使用空布局 2.构造方法里写初始打开的界面 3.return 意思是 "否则"  代替else if,一切归于平静 4.连接数据库时 db=new database ...

  7. WC2020 Cu 记

    由于今年的 WC 既不 W 也不 C,所以其实应该叫吸吸F线上推广 3M 原则记 Day1 上午听了一会儿课跑去写题了,写着写着就摸了起来. 下午也摸了 晚上员交发现有好多听过的和好多好多没听过的 怎 ...

  8. Dubbo系列之 (二)Registry注册中心-注册(1)

    引导 dubbo的服务的注册与发现,需要通过第三方注册中心来协助完成,目前dubbo支持的注册中心包括 zookeeper,consul,etcd3,eureka,nacas,redis,sofa.这 ...

  9. Django-model查询[为空、由某字符串开头、由某字符串结尾、包含某字符串],__isnull、__starswith、__endswith、__contains

    使用属性+__isnull就可以判断此字段为空 a = DatasClass.objects.filter(name__isnull=True) 使用属性+__startswith可以判断属性由某字符 ...

  10. 主成分分析PCA数据降维原理及python应用(葡萄酒案例分析)

    目录 主成分分析(PCA)——以葡萄酒数据集分类为例 1.认识PCA (1)简介 (2)方法步骤 2.提取主成分 3.主成分方差可视化 4.特征变换 5.数据分类结果 6.完整代码 总结: 1.认识P ...