欢迎来到十九分快乐的博客

生死看淡,不服就干。

4.进程-1

进程

1.进程 process

# 进程 process
"""
Linux 查看后台进程 :  ps -aux
进程号是进程的唯一标识:
    获取进程号:
        os.getpid() 获取当前进程ID号
        os.getppid() 获取当前进程的父进程ID号
强制杀死进程 : kill -9 进程号
"""
import os,time
from multiprocessing import Process  #引用进程类

# 1.进程基本语法
def func():
    print("当前进程ID{},父进程ID{}, 111".format(os.getpid(),os.getppid()))

if __name__ == "__main__": #为了兼容Windows和Linux,此条件必须写
    p = Process(target = func) #创建子进程对象
    p.start() #调用子进程
    # 在主进程中,打印进程ID号
    print("当前进程ID{},父进程ID{}, 222".format(os.getpid(),os.getppid()))
"""
当前进程ID3051,父进程ID2308, 222  主进程打印的是本文件进程ID和pycharm进程ID
当前进程ID3052,父进程ID3051, 111  子进程打印的是子进程ID和值进程ID
"""

# 2.创建带有参数的进程
def func(n):
    for i in range(n):
        print(i,"当前进程ID{},父进程ID{}, 111".format(os.getpid(),os.getppid()))

if __name__ == "__main__":
    n = 10
    #target = 指定执行的任务 args = 参数元组
    p = Process(target = func ,args = (n,)) #创建子进程对象
    p.start() #调用子进程
    
    print("江山如此多娇")

# 3.进程之间的数据彼此隔离
num = 10
def func():
    global num
    num +=1
    print(num,"子进程")

if __name__ == "__main__":
    p = Process(target = func)
    p.start()
    time.sleep(0.2)
    print(num,"主进程")
"""
11 子进程
10 主进程
"""

# 4.进程的异步性
"""
场景在多任务当中 
同步: 必须等我这件事干完了,你在干,只有一条主线,就是同步
异步: 没等我这件事情干完,你就在干了,有至少两条主线,就是异步
阻塞: 比如代码有了input,就是阻塞,必须要输入一个字符串,否则代码不往下执行
非阻塞: 没有任何等待,正常代码往下执行.
"""
"""
1.多个进程在执行时,是异步并发程序,因为cpu的调调策略问题,
    那个进程能更快的分配好资源就先执行
    遇到阻塞就立即切换到就绪状态的任务上,使整体效率最大化
2.主进程默认会等待所有的子进程都执行完毕后,关闭程序,释放资源

孤儿进程 : 主进程执行结束了,子进程还在运行,占用空间资源,称为孤儿进程
僵尸进程 : 子进程都执行结束了,主进程还没有收到子进程的退出状态,
                主进程不能释放资源,还持续的在内存中保留,称为僵尸进程
"""
def func(n):
    print(n,"子进程ID:{},父进程ID:{}".format(os.getpid(),os.getppid()))

if __name__ =="__main__":
    for i in range(6):
        p = Process(target = func,args = (i,))
        p.start()
    print("主进程结束~!")

2.同步进程和自定义进程类

# 一 : 同步主进程和子进程
"""
语法 : 进程对象.join()
意义 : 必须等待当前子进程执行结束后,再去执行下面的代码
作用 : 用来同步子父进程
"""
from multiprocessing import Process

# 1.join 基本使用
def func():
    print("第一个~")
    
if __name__ == "__main__":
    p = Process(target = func)
    p.start()
    p.join()
    print("第二个~")
"""
第一个~
第二个~
"""

# 2.多进程场景
def func(n):
    print("这是第{}个~".format(n))
    
if __name__ =="__main__":
    lst = []
    for i in range(5):
        p = Process(target = func , args = (i,))
        p.start()
        # p.join() 此处用join会导致程序由异步并发,变成同步进程,降低了执行效率
        lst.append(p) #可以先异步创建多个进程对象,放到列表中
    for i in lst: #再调用join进行同步管理
        i.join()
    print("最后一个了~")

# 二 : 使用自定义进程类,创建进程
# 1.基本写法
"""
自定义进程类:
    必须继承父类Process
    必须定义run方法
"""
from multiprocessing import Process 
class MyProcess(Process):
    def run(self):
        print("生活就是这样~")
        
if __name__ == "__main__":
    p = MyProcess()
    p.start()
    p.join()
    print("不然你要怎样~")
"""
不然你要怎样~
生活就是这样~
"""
# 2.带有参数的自定义进程类
class My(Process):
    def __init__(self,name):
        self.name = name
        super().__init__() #手动调用父类的构造方法,完成成员初始化
    def run(self):
        print(self.name)

if __name__ == "__main__":
    p = My("我们是祖国的花朵~")
    p.start()
    p.join()
    print("着装好看~")

3.守护进程

# 守护进程
"""
守护进程守护的是主进程
当主进程的所有代码执行结束后,会立刻终止守护进程
守护进程内无法再开启子进程,否则抛出异常
"""
from multiprocessing import Process
import time 

# 1.基本语法
def func():
    print("子进程启动")
if __name__ == "__main__":
    p = Process(target = func)
    p.daemon = True #设置守护进程,在start调用之前
    p.start()
    print("主进程代码执行结束~")
"""
主进程代码执行结束~
"""

# 2.多个子进程情况
def func1():
    print("我是老大~")

def func2():
    print("我是老二~")

if __name__ == "__main__":
    p1 = Process(target = func1)
    p2 = Process(target = func2)
    p2.daemon = True #把p2设置成守护程序
    p1.start()
    p2.start()
    print("主进程代码执行结束~")
"""
主进程代码执行结束~
我是老大~
"""

# 3.守护进程用途 : 监控报活
def alive():
    while True:
        print("1号服务器向总监控服务器报活~")
        time.sleep(0.5)
def func():
    while True:
        try:
            print("1号服务器负责抗住1万用户量的并发访问")
            time.sleep(3) #三秒后崩溃
            raise RuntimeError #主动抛出异常
        except:
            print("1号服务器挂了...需要维护")
            break

if __name__ == "__main__":
    p1 = Process(target = alive) #负责报活
    p2 = Process(target = func) #抗住用户并发
    p1.daemon = True
    p1.start()
    p2.start()
    p2.join() #必须等待2号执行完
    print("主进程代码执行结束~")
posted @ 2020-12-29 21:29  十九分快乐  阅读(46)  评论(0编辑  收藏  举报