• Python入门学习-DAY34-开启进程的两种方法、join方法、进程之间内存空间互相隔离、进程对象其他相关的属性或方法、僵尸进程与孤儿进程、守护进程、互斥锁


    一、开启进程的两种方法

    方法一

    from multiprocessing import Process
    import time
    
    
    def task(name):
        print('%s is running'%name)
        time.sleep(3)
        print('%s is done'%name)
    
    
    if __name__ == '__main__':
        p=Process(target=task,args=('egon',))#p=Process(target=task,kwargs=['name':'egon'])
        p.start()
        print('主程序')

    方法二

    from multiprocessing import Process
    import time
    
    class Myprocess(Process):
        def __init__(self,name):
            super().__init__()
            self.name=name
    
        def run(self):
            print('%s is running'%self.name)
            time.sleep(3)
            print('%s is done'%self.name)
    
    
    if __name__ == '__main__':
        p=Myprocess('egon')
        p.start()
        print('主程序')

    二、join方法

    主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。需要强调的是,p.join只能join住start开启的进程
    from multiprocessing import Process
    import time
    
    
    def task(name,n):
        print('%s is running'%name)
        time.sleep(n)
        print('%s is done'%name)
    
    
    if __name__ == '__main__':
        p1=Process(target=task,args=('p1',1))
        p2 = Process(target=task, args=('p2', 2))
    
        p1.start()
        p2.start()
    
        p1.join()
        p2.join()
        print('主程序')

    三、进程之间内存空间互相隔离

      虽然进程之间是空间上的复用,但是在内存中其实每个进程之间都是在物理层面上隔开的,接下来就用代码来验证

    from multiprocessing import Process
    
    
    n=100
    def task():
        global n
        n=0
        print('子进程n=',n)#0
    
    
    if __name__ == '__main__':
        p1=Process(target=task)
        p1.start()
        p1.join()
        print('主进程n=',n)#100

    四、进程对象其他相关的属性或方法

    1.pid:进程的唯一ID号
    1.current_process().pid:当前进程的ID号
    2.os.getpid:当前进程的ID号
    3.os.getppid:当前进程的父进程ID号
    2.name:当前进程的name
    3.p.terminate():强制终止进程p
    4.p.is_alive():如果p仍然运行,返回True

     

    五、僵尸进程与孤儿进程

    僵尸进程 

    一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵尸进程。

    孤儿进程 

    一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为0)所收养,并由init进程对它们完成状态收集工作。

     

    六、守护进程

    本质就是一个"子进程",该"子进程"的生命周期<=被守护进程的生命周期

    from multiprocessing import Process
    import time
    
    
    def task(name):
        print('%s is 活着'%name)
        time.sleep(3)
        print('%s is 死了'%name)
    
    
    if __name__ == '__main__':
        p=Process(target=task,args=('egon',))
        p.daemon=True
        p.start()
        time.sleep(1)
        print('主正在死')

    七、互斥锁

    进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,

    而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理

    import json
    import time,random
    from multiprocessing import Process,Lock
    
    def search(name):
        with open('db.json','rt',encoding='utf-8') as f:
            dic=json.load(f)
        time.sleep(1)
        print('%s 查看到余票为 %s' %(name,dic['count']))
    
    def get(name):
        with open('db.json','rt',encoding='utf-8') as f:
            dic=json.load(f)
        if dic['count'] > 0:
            dic['count'] -= 1
            time.sleep(random.randint(1,3))
            with open('db.json','wt',encoding='utf-8') as f:
                json.dump(dic,f)
                print('%s 购票成功' %name)
        else:
            print('%s 查看到没有票了' %name)
    
    def task(name,mutex):
        search(name) #并发
        mutex.acquire()
        get(name) #串行
        mutex.release()
    
        # with mutex:
        #     get(name)
    
    if __name__ == '__main__':
        mutex = Lock()
        for i in range(10):
            p=Process(target=task,args=('路人%s' %i,mutex))
            p.start()
            # p.join() # join只能将进程的任务整体变成串行








  • 相关阅读:
    Spring (4)框架
    Spring (3)框架
    Spring (2)框架
    javaSE面试题总结 java面试题总结
    分层结构
    三次握手
    17_网络编程
    16_多线程
    Ecplise中指定tomcat里Web项目发布文件
    Web 项目没有发布到我们安装的tomcat目录下
  • 原文地址:https://www.cnblogs.com/xvchengqi/p/9592390.html
Copyright © 2020-2023  润新知