• python 多进程详细总结


    多进程:是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位。

    特征:

    • 动态性:进程的实质是程序在多任务系统中的一次执行过程,进程是动态产生,动态消亡的。
    • 并发性:任何进程都可以同其他进程一起并发执行
    • 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
    • 异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度执行
    • 结构特征:进程由程序、数据和进程控制块三部分组成。
    • 多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;但是执行过程中,程序不能发生改变。

    python中多进程模块multiprocessing的基本使用:

    创建并开启进程的两种方法:

    #方法一 直接调用import time
    import random
    from multiprocessing import Process
    def run(name):
        print('%s runing' %name)
        time.sleep(random.randrange(1,5))
        print('%s running end' %name)
    
    
    '''
    创建三个进程
    target表示调用对象,即子进程要执行的任务
    args表示调用对象的位置参数元组,args=(1,2,'anne',)
    '''
    p1=Process(target=run,args=('anne',))   
    p2=Process(target=run,args=('alice',))
    p3=Process(target=run,args=('biantai',))
    p4=Process(target=run,args=('haha',))
    
    p1.start()
    p2.start()
    p3.start()
    p4.start()
    print('主进程')
    
    #方法二 继承式调用
    import time
    import random
    from multiprocessing import Process
    
    
    class Run(Process):
        def __init__(self,name):
            super().__init__()
            self.name=name
        def run(self):
            print('%s runing' %self.name)
            time.sleep(random.randrange(1,5))
            print('%s runing end' %self.name)
    
    p1=Run('anne')
    p2=Run('alex')
    p3=Run('ab')
    p4=Run('hey')
    p1.start() #start会自动调用run
    p2.start()
    p3.start()
    p4.start()
    print('主进程')
    

    注:上述代码的运行顺序是启动程序时主进程随之启动,接下来主进程负责创建3个子进程,3个子进程去分别执行自己的任务,此时主进程会继续往下走,但有的时候我们需要子进程任务结束之后才让主进程往下走,此时我就需要让主进程等待子进程完成任务后再往下走。此时就用到了join(), 例如:

    import time
    import random
    from multiprocessing import Process
    
    
    class Run(Process):
        def __init__(self,name):
            super().__init__()
            self.name=name
        def run(self):
            print('%s runing' %self.name)
            time.sleep(random.randrange(1,5))
            print('%s runing end' %self.name)
    
    p1=Run('anne')
    p2=Run('alex')
    p3=Run('ab')
    p4=Run('hey')
    p1.start() #start会自动调用run
    p2.start()
    p3.start()
    p4.start()
    p1.join() #等待p1进程停止
    p2.join()
    p3.join()
    p4.join()
    print('主线程')
    
    #注意上面的代码是主进程等待子进程,等待的是主进程,所以等待的总时间是子进程中耗费时间最长的那个进程运行的时间
    
    #上述启动进程与join进程可以简写为
    # p_l=[p1,p2,p3,p4]
    # 
    # for p in p_l:
    #     p.start()
    # 
    # for p in p_l:
    #     p.join()
    
    主进程等待子进程结束
    

    进程之间不共享全局变量:

    import os
    from multiprocessing import Process
    
    a = 100
    def run():
        print("子进程正在执行pid为{}".format(os.getpid()))
        global a
        a += 100
        print("子进程执行结束a的值为{}".format(a))
    
    if __name__ == '__main__':
        p=Process(target=run)
        p.start()
        p.join()
        print("父进程{}执行结束a的值为{}".format(os.getppid(),a))
    
        '''
          结果:
                子进程正在执行pid为57822
                子进程执行结束a的值为200
                父进程16504执行结束a的值为100
          '''
    
    
  • 相关阅读:
    python并发编程之多进程(实践篇)
    python之网络编程
    python并发编程之协程(实践篇)
    python并发编程之IO模型(实践篇)
    复制命令(ROBOCOPY)
    创建文件命令
    创建文件夹命令
    复制命令(XCOPY)
    进程命令(tasklist)
    目录命令(tree)
  • 原文地址:https://www.cnblogs.com/lpdeboke/p/13360556.html
Copyright © 2020-2023  润新知