zoukankan      html  css  js  c++  java
  • python中多进程应用及僵尸进程、孤儿进程

    一、python如何使用多进程

    创建子进程的方式

    1.导入multiprocessing 中的Process类 实例化这个类 指定要执行的任务 target

    import os
    from multiprocessing import Process
    """
    Process 就表示进程
    为什么要开进程
    """
    
    def task():
        print("this is sub process")
        print("sub process id %s" % os.getpid())
    
    
    if __name__ == '__main__':
        # ######注意 开启进程的代码必须放在 ————main————判断下面
        #  实例化一个进程对象 并制定他要做的事情  用函数来指定
        p = Process(target=task)
        p.start() # 给操作系统发送消息 让它开启进程
        print("this is parent process")
        print("parent process is: %s" % os.getpid())
        print("over")
    

    linux 与windows开启进程的方式不同

    linux 会将父进程的内存数据 完整copy一份给子进程

    注意:

    ​ windows 会导入父进程的代码 从头执行一遍 来获取需要处理的任务

    ​ 所以在编写代码时如果是windows一定要将开启进程的代码放main判断中

    ​ linux 可以不放

    2.导入multiprocessing 中的Process类 继承这个类 覆盖run方法 将要执行的任务放入run中开启进程时会自动执行该函数

    from multiprocessing import Process
    import os
    
    
    class Downloader(Process):
    
        # def __init__(self,url,size,name):
        #     super().__init__()
        #     self.url = url
        #     self.size = size
        #     self.name = name
    
        def run(self):
            print(os.getpid())
            pass
    
    if __name__ == '__main__':
        m = Downloader()
        m.start()
        print("parent over",os.getpid())
    

    如果需要对进程对象进行高度自定义那就可以继承它

    进程之间内存相互隔离

    from multiprocessing import  Process
    import os,time
    
    a = 257
    
    
    def task():
        global a
        # print("2",a,id(a))
        a = 200
         
    
    if __name__ == '__main__':
        p = Process(target=task)
        p.start() # 向操作系统发送指令
    
        time.sleep(4)
        print(a)
    

    join函数

    from multiprocessing import Process
    import time
    def task1(name):
        for i in range(10000):
            print("%s run" % name)
    
    def task2(name):
        for i in range(100):
            print("%s run" % name)
    
    if __name__ == '__main__': # args 是给子进程传递的参数 必须是元组
        p1 = Process(target=task1,args=("p1",))
        p1.start()  # 向操作系统发送指令
        # p1.join()   # 让主进程 等待子进程执行完毕在继续执行
    
        p2 = Process(target=task2,args=("p2",))
        p2.start()  # 向操作系统发送指令
    
        p2.join()  # 让主进程 等待子进程执行完毕在继续执行
        p1.join()
    
    
        #需要达到的效果是 必须保证两个子进程是并发执行的 并且 over一定是在所有任务执行完毕后执行
        print("over")
    

    案例:

    # join的使用
    from multiprocessing import Process
    import time
    def task1(name):
        for i in range(10):
            print("%s run" % name)
    
    
    if __name__ == '__main__': # args 是给子进程传递的参数 必须是元组
    
    
        ps = []
        for i in range(10):
            p = Process(target=task1,args=(i,))
            p.start()
            ps.append(p)
    
        # 挨个join以下
        for i in ps:
            i.join()
    
        print("over")
    

    二、僵尸进程与孤儿进程

    孤儿进程 当父进程已经结束 而子进程还在运行 子进程就称为孤儿进程 尤其存在的必要性,没有不良影响

    僵尸进程 当一个进程已经结束了但是,它仍然还有一些数据存在 此时称之为僵尸进程

    在linux中,有这么一个机制,父进程无论什么时候都可以获取到子进程的的 一些数据

    子进程 任务执行完毕后,确实结束了但是仍然保留一些数据 目的是为了让父进程能够获取这些信息

    linux中 可以调用waitpid来是彻底清除子进程的残留信息

    python中 已经封装了处理僵尸进程的操作 ,无需关心

  • 相关阅读:
    spring MVC配置详解
    使用JDBC连接各种数据库
    Linux Shell常用shell命令
    IOS返回go(-1)
    NFS客户端挂载
    oracle常用函数
    支付宝手机网站支付流程(Node实现)
    SQL中的case when then else end用法
    mysql
    socket
  • 原文地址:https://www.cnblogs.com/chuwanliu/p/11121734.html
Copyright © 2011-2022 走看看