zoukankan      html  css  js  c++  java
  • 多进程(一)

    多进程(一)

    1.进程创建的两种方式

    开启进程的第一种方式:
        
    from multiprocessing import Process
    import time
    
    def task(name):
        print(f'{name} is running')
        time.sleep(2)
        print(f'{name} is done')
    
    if __name__ == '__main__':  
        #windows环境,开启进程必须在__name__ == '__main__'下
        p = Process(target = task,args = ('alex',))
        #创建一个进程对象
        p.start()
        #只是向操作系统发出一个开辟子进程的信号,然后就执行下一行了
        #操作系统收到信号后,会从内存中开辟一个子进程空间,然后再将主进程所有数据copy到子进程,然后再调用cpu去执行(开辟子进程开销很大),所以永远会先执行主进程的代码
        print('主进程运行')
        
    #主进程运行
    #alex is running
    #alex is done
        
    开启进程的第二种方式:
        
    from multiprocessing import Process
    import time
    
    class MyProcess(Process):
        def __init__(self,name):
            super().__init__()
            self.name = name
        def run(self):
            print(f'{self.name} is running')
            time.sleep(2)
            print(f'{self.name} is done')
            
    if __name__ == '__main__':
        p = MyProcess('alex')
        p.start()
        print('主进程运行')
        
    #主进程运行
    #alex is running
    #alex is done
    
    简单应用:
        
    from multiprocessing import Process
    import time
    
    def task(name):
        print(f'{name} is running')
        time.sleep(1)
        print(f'{name} is done')
        
    def task1(name):
        print(f'{name} is running')
        time.sleep(2)
        print(f'{name} is done')
        
    if __name__ == '__main__':
        p1 = Process(target = task,args = ('alex',))
        p2 = Process(target = task,args = ('tony',))
        start_time = time.time()
        p1.start()
        p2.start()
        #两个进程,并发或者并行的执行三个任务
        print(f'结束时间{time.time() - start_time}')
        
    #结束时间0.03194904327392578
    #alex is running
    #tony is running 
    #alex is done
    #tony is done
    

    2.获取进程pid

    区分内存中的进程:
        命令行:获取所有进程的pid(process id): tasklist,
              查找某个进程的pid:  tasklist|findstr 进程名
    
    	代码级别:
            	import os
                print(os.getpid())
                
    获取父进程(主进程的pid):
        import os
        print(os.getppid())
    

    3.验证进程之间的空间隔离

    from multiprocessing import Process
    import time
    
    name = 'alex'
    def task():
        global name
        name = 'tom'
        print(f'子进程:{name}')
    
    if __name__ == '__main__':
        p = Process(target = task)
        p.start()
        time.sleep(3)
        print(f'主进程:{name}')
        
    #子进程:tom
    #主进程:alex
    
    lst = [1,2]
    def task():
        global lst
        lst.append(3)
        print(f'子进程:{lst}')
    
    if __name__ == '__main__':
        p = Process(target = task)
        p.start()
        time.sleep(3)
        print(f'主进程:{lst}')
    
    #子进程:[1, 2, 3]
    #主进程:[1, 2]
    

    4.join方法

    join:让主进程等待子进程结束之后,再执行主进程
     
    from multiprocessing import Process
    import time
    
    def task(name):
        print(f'{name} is running')
        time.sleep(2)
        print(f'{name} is done')
     
    if __name__ == '__main__':
        p = Process(target = task,args = ('alex',))
        p.start()
        p.join()
        print('主进程开始')
        
    #alex is running
    #alex is done
    #主进程开始
    
    多个子进程使用join,join就是阻塞,主进程有join,主进程下面的代码一律不执行,直到进程执行完毕之后,在执行.
    验证1:
    
    from multiprocessing import Process
    import time
    
    def task(name,sec):
        print(f'{name} is running')
        time.sleep(sec)
        print(f'{name} is done')
        
    if __name__ == '__main__':
        start_time = time.time()
        p1 = Process(target = task,args = ('alex',1))
        p2 = Process(target = task,args = ('tom',2))
        p3 = Process(target = task,args = ('tony,3'))
        p1.start()
        p2.start()
        p3.start()
        p1.join() #join只针对主进程,如果join下面多次join,则不阻塞
        p2.join()
        p3.join()
        print(f'主进程:{time.time() - start_time}')
        
    #alex is running
    #tom is running
    #tony is running
    #alex is done
    #tom is done
    #tony is done
    #主进程:3.1952016353607178
    
    验证2:
      
    from multiprocessing import Process
    import time
    
    def task(name,sec):
        print(f'{name} is running')
        time.sleep(sec)
        print(f'{name} is done')
        
    if __name__ == '__main__':
        start_time = time.time()
        p1 = Process(target = task,args = ('alex',1))
        p2 = Process(target = task,args = ('tom',2))
        p3 = Process(target = task,args = ('tony,3'))
        p1.start()
        p1.join()
        p2.start()
        p2.join()
        p3.start()
    	p3.join()
        print(f'主进程:{time.time() - start_time}')
    
    #alex is running
    #alex is done
    #tom is running
    #tom is done
    #tony is running
    #tony is done
    #主进程:6.42280125617981
    
    优化上面的代码:
     
    from multiprocessing import Process
    import time
    
    def task(name,sec):
        print(f'{name} is running')
        time.sleep(sec)
        print(f'{name} is done')
        
    if __name__ == '__main__':
        start_time = time.time()
    	lst = []
        for i in range(1,4):
            p = Process(target = task,args = (i,))
            lst.append(p)
            p.start()     #循环时间很快,基本可以实现同时发出指令
        for i in lst:
            i.join()
        print(f'主进程:{time.time() - start_time}')
    

    5.进程的其他属性

    from multiprocessing import Process
    import time
    
    def task(name):
        print(f'{name} is running')
        time.sleep(2)
        print(f'{name} is done')
        
    if __name__ == '__main__':
        p = Process(target = task,args = ('alex',)name = 'tony')
        p.start()
        p.terminate()  #杀死子进程,没有阻塞则子程序还没运行就被杀死
    	print(P.is_alive())   #看子进程是否还活着,输出True/False 
        print(p.name)  #输出之前给p添加的name属性
        print("主进程运行")
    

    6.守护进程

    守护进程:
        子进程守护主进程,只要主进程结束,子进程跟着就结束
        
    from multiprocessing import Process
    import time
    
    def task(name):
        print(f'{name} is running')
        time.sleep(2)
        print(f'{name} is done')
        
    if __name__ == '__main__':
        p = Process(target = task,args = ('alex',))
        p.daemon = True #将子进程p设置成守护进程,主进程结束,子进程也结束
        p.start()
        #p.daemon = True #一定要在子进程开启之前设置,否则报错
        time.sleep(1)
        print('主进程运行')
        
    #alex is running
    #主进程运行
    
  • 相关阅读:
    Spring学习笔记
    deepin linux 下C开发环境配置
    deepin linux 15.3安装完eclipse启动报错An error has occurred.
    windows下安装vundle
    Tomcat 改服务器编码(Java 修改字符串编码格式)
    servlet request getQueryString 汉字的URI编码如何转码
    servlet request
    servlet awt随机图片验证码
    java获取unicode码
    技术总监
  • 原文地址:https://www.cnblogs.com/tutougold/p/11391385.html
Copyright © 2011-2022 走看看