zoukankan      html  css  js  c++  java
  • 进程对象的属性或方法详解

    子进程的出现是为了实现并发

    from multiprocessing import Process
    import time
    
    x=100
    def task():
        global x
        x=0
        print('done')  # 父进程在等待的时间内子进程执行完了,打印出“done”
    if __name__ == '__main__':
        p=Process(target=task)
        p.start()
        time.sleep(5) # 让父进程在原地等待,等了500s后,才执行下一行代码
        print(x)   # x输出还是100 证明两个进程是互相独立的
    进程内存相互独立

    join()让父进程在原地等,直到子进程运行结束才运行下面的程序。

    # 1、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=('子进程1',))
        p.start()
        p.join() # 让父进程在原地等待,等到子进程运行完毕后,才执行下一行代码
        print('')
    join用法

    p.join()--- 未用循环 同时发送进程创建请求,多进程同时运行。

    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=('子进程1',1)) # 三个进程先创建出来
        p2=Process(target=task,args=('子进程2',2))
        p3=Process(target=task,args=('子进程3',3))
        start_time=time.time()
        p1.start()
        p2.start()
        p3.start()
        p3.join()   # 全部的子进程3s多一点执行完毕。多出来的一点是分配空间等的时间
        p1.join()  # 让父进程在原地等待,等到子进程执行完毕才执行下面的代码
        p2.join()   
        stop_time=time.time()
        print('',(stop_time-start_time))
    子进程join方法

    未同时向操作系统发起开启子进程的信号,所以都是在一个子进程结束才开始下一个信号发送,然后等待该子进程结束,进程没有同时运行,相当于串行,浪费时间。

    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=('子进程1',1))
        p2=Process(target=task,args=('子进程2',2))
        p3=Process(target=task,args=('子进程3',3))
    
        start=time.time()
        p1.start()
        p1.join()
        p2.start()
        p2.join()
        p3.start()
        p3.join()
    
        stop=time.time()
        print('',(stop-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=('子进程1',1))
        # p1.start()
        # p2=Process(target=task,args=('子进程2',2))
        # p2.start()
        # p3=Process(target=task,args=('子进程3',3))
        # p3.start()
    
        p_l=[]
        start=time.time()
        for i in range(1,4):
            p=Process(target=task,args=('子进程%s' %i,i))
            p_l.append(p)
            p.start()  # 把建好的进程放进列表里,同时建立一个进程向操作系统发起一个信号
    
        # print(p_l)
        for p in p_l:
            p.join()
    
        stop=time.time()
    
        print('',(stop-start))
    循环子进程并发

    父进程内查看自己进程pid(processing id)

    # pid
    from multiprocessing import Process
    import time
    import os
    
    def task(n):
        print('%s is running ' %os.getpid())
        time.sleep(n)
        print('%s is done ' % os.getpid())
    
    
    if __name__ == '__main__':
        p1=Process(target=task,args=(10,))
        # print(p1.pid)
        p1.start()
        print(p1.pid) # 父进程内查看子pid的方式
        print('')
    父进程查看自己进程pid

    查看自己和父进程的pid  ppid就是parent_pid 父进程

    谁开启子进程谁就是他的父进程

    from multiprocessing import Process
    import time
    import os
    
    def task():
        print('自己的id:%s 父进程的id:%s ' %(os.getpid(),os.getppid())) # os.getppid()查看父进程id 8792
        time.sleep(200)
    
    if __name__ == '__main__':
        p1=Process(target=task)
        p1.start()
        print('',os.getpid(),os.getppid()) # 这里的getpid查看子进程pid 8792
        # 爹=》主--》儿子
    查看自己和父进程pid

    了解知识点:子进程自定义名字

    # 了解
    # 具体的子进程名字
    from multiprocessing import Process,current_process
    import time
    
    def task():
        print('子进程[%s]运行。。。。' %current_process().name)
        time.sleep(200)
    
    if __name__ == '__main__':
        p1=Process(target=task,name='子进程1')
        p1.start()
        # print(p1.name)
        print('')
    子进程名字

    terminate

    from multiprocessing import Process,current_process
    import time
    
    def task():
        print('子进程[%s]运行。。。。' %current_process().name)
        time.sleep(2)
    
    if __name__ == '__main__':
        p1=Process(target=task,name='子进程1')
        p1.start()
    
        # print(p1.is_alive())  # True
        # p1.join()
        # print(p1.is_alive())  # False
    
        p1.terminate()
        time.sleep(1)
        print(p1.is_alive())  # False  如果没有time.sleep(1) 就是True
        print('')
    terminate
    tasklist | findstr 进程号  查找进程
    taskkill /F/PID 进程号 杀死进程

    僵尸进程和孤儿进程
    僵尸进程与孤儿进程
    在unix系统中init是所有进程的爹;创建进程用fork,回收进程用waitpid
    僵尸进程(有害:占用pid):子代先于父代终结,其部分信息(pid等)没有从系统中删除,需要父代回收。join中含有回收子代信息的功能。
    孤儿进程(无害):父代先于子代终结,子代终结后的部分信息由init代收。
    
    from multiprocessing import Process                      
    import time,os                                           
                                                             
    def task(n):                                             
        print('%s is running' %n)                            
        time.sleep(n)                                        
                                                             
    if __name__ == '__main__':                               
        p1=Process(target=task,args=(1,))                    
        p1.start()                                           
        p1.join()     # join中含有回收子代信息的功能(wait)                                       
        print('======主',os.getpid())                         
        time.sleep(10000)    
    僵尸进程和孤儿进程
    
    
    
     
  • 相关阅读:
    Thinking Clearly about Performance
    国家统计局2018-10-30统计的最新的省市区
    Java 返回字符串中第一个不重复字符的下标 下标从0开始
    国际象棋的游戏规则
    Python语言之requests库
    VBS 自动发消息给对方
    Windows
    上海合计共有16个区一个县
    @RequestMapping中的注解
    Linux 中 /proc/kcore为啥如此之大
  • 原文地址:https://www.cnblogs.com/Roc-Atlantis/p/9295785.html
Copyright © 2011-2022 走看看