开发者

python中的多进程的创建与启动方式

开发者 https://www.devze.com 2022-12-02 09:26 出处:网络 作者: 小树苗m
目录一、多进程的创建:多进程的创建方法有两种:1、通过Process创建多进程 Prwww.devze.comocess语法结构:2、通过进程池创建并启动多进程3、通过继承的方法创建多进程4、进程创建与启动完整代码python中的并发有三
目录
  • 一、多进程的创建:多进程的创建方法有两种:
    • 1、通过Process创建多进程 Prwww.devze.comocess语法结构:
  • 2、通过进程池创建并启动多进程
    • 3、通过继承的方法创建多进程
      • 4、进程创建与启动完整代码

        python中的并发有三种形式,多进程、多线程、协程。执⾏并发任务的⽬的是为了提⾼程序运⾏的效率。

        一、多进程的创建:多进程的创建方法有两种:

        1、通过Process创建多进程 Process语法结构:

        			Process(group, target, name, args, kwargs)
        			group:指定进程组,⼤多数情况下⽤不到
        			target:表示调用对象,即子进程要执行的任务
        			name:子进程的名称,可以不设定
        			args:给target指定的函数传递的参数,以元组的⽅式传递
        			kwargs:给target指定的函数传递命www.devze.com名参数

        Pr编程客栈ocess常用方法:

        			p.start() 启动进程,并调用该子进程中的p.run()方法
        			p.join(timeout):主进程等待⼦进程执⾏结束再结束,timeout是可选的超时时间
        			is_alive():判断进程⼦进程是否还存活
        			p.run() 进程启动时运行的方法,正是它去调用target指定的函数
        			p.terminate() ⽴即终⽌⼦进程

        (1)首先,定义一个待调用的函数:

        import os
        from multiprocessing import Process
        def add(name,num):
            nums = 0
            for i in range(num+1):
                nums = nums+i
            print("用户%s:\n  相加结果为:%s \n  当前进程id为:%s \n  当前子进程的父进程id: %s"%(name,nums,os.getpid(),os.getppid()))

        (2)创建并启动一个进程

        def test1():
            '''启动一个进程调用'''
            name= '王五'
            p = Process(target=add,args=(name,10,))
            p.start()
            p.join()

        其中,p.join()方法可以让主进程等待子进程结束之后再结束,如果不加这个方法,主进程结束,子进程还没有结束。

        (2)创建并启动多个进程

        def test3():
            names = ['王五','赵六','王麻子']
            process_list=[]
            for name in names:
                p = Process(target=add,args=(name,10,))
                p.start()
                process_list.append(p)
            for j in process_list:
                j.join()

        2、通过进程池创建并启动多进程

        进程池可以提供指定数量的进程给用户使用,即当有新的请求提交到进程池中时,如果池未满,则会创建一个新的进程用来执行该请求;反之,如果池中的进程数已经达到规定最大值,那么该请求就会等待,只要池中有进程空闲下来,该请求就能得到执行。

        Pool(numprocess, initializer, initargs)

        numprocess 是要创建的进程数。如果省略此参数,默认为cpu的最大核心数。

        Initializer是每个工作进程启动时要执行的可调用对象。

        Initargs 传递给 initializer 的参数元祖,默认为 None

        def test4():
            from multiprocessing import Pool
            '''启动多个进程2:进程池'''
            p = Pool(5)
            names = ['王五','赵六','王麻子']
            for name in names:
                p.apply_async(add,args=(name,10))
            p.close()
            p.join()

        3、通过继承的方法创建多进程

        (1)首先创建一个进程

        class SubProcess(Process):
            def __init__(self,nam开发者_Go开发e,number):
                super(SubProcess, self).__init__()
                self.name = name
                self.number = number
            def run(self):
                sums = 0
                for i in range(self.number):
                    sums = sums+i
                print("用户%s:\n  相加结果为:%s \n  当前进程id为:%s \n  当前子进程的父进程id: %s"\
                      %(self.name,self.number,os.getpid(),os.getppid()))

        (2)启动一个进程

        def call_Sub0():
            '''启动一个进程调用'''
            name = '张三'
            p = SubProcess(name,10)
            p.start()
            p.join()

        (3)通过列表启动多个进程

        def call_Sub1():
            '''启动多个进程1'''
            names = ['王五','赵六','王麻子']
            process_list=[]
            for name in names:
                p = SubProcess(name,10)
                p.start()
                process_list.append(p)
            for j in process_list:
                j.join()
         if __name__ == '__main__':
            print("当前主进程id:",os.getpid())
            call_Sub1()
            print("计算结束!")

        4、进程创建与启动完整代码

        import os
        from multiprocessing import Process
        def add(name,num):
            nums = 0
            for i in range(num+1):
                nums = nums+i
            print("用户%s:\n  相加结果为:%s \n  当前进程id为:%s \n  当前子进程的父进程id: %s"%(name,nums,os.getpid(),os.getppid()))
        def test1():
            '''启动一个进程调用'''
            name= '王五'
            p = Process(target=add,args=(name,10,))
            p.start()
            p.join()
        def test3():
            '''启动多个进程2'''
            names = ['王五','赵六','王麻子']
            process_list=[]
            for name in names:
                p = Process(target=add,args=(name,10,))
                p.start()
                process_list.append(p)
            for j in process_list:
                j.join()
        '''
        进程池:可以提供指定数量的进程给用户使用,即当有JBVDVRXN新的请求提交到进程池中时,
        如果池未满,则会创建一个新的进程用来执行该请求;反之,如果池中的进程数已经达到规定最大值,
        那么该请求就会等待,只要池中有进程空闲下来,该请求就能得到执行。
        '''
        def test4():
            from multiprocessing import Pool
            '''启动多个进程2:进程池'''
            p = Pool(5)
            names = ['王五','赵六','王麻子']
            for name in names:
                p.apply_async(add,args=(name,10))
            p.close()
            p.join()
        
        class SubProcess(Process):
            deandroidf __init__(self,name,number):
                super(SubProcess, self).__init__()
                self.name = name
                self.number = number
            def run(self):
                sums = 0
                for i in range(self.number):
                    sums = sums+i
                print("用户%s:\n  相加结果为:%s \n  当前进程id为:%s \n  当前子进程的父进程id: %s"\
                      %(self.name,self.number,os.getpid(),os.getppid()))
        def call_Sub0():
            '''启动一个进程调用'''
            name = '张三'
            p = SubProcess(name,10)
            p.start()
            p.join()
        def call_Sub1():
            '''启动多个进程1'''
            names = ['王五','赵六','王麻子']
            process_list=[]
            for name in names:
                p = SubProcess(name,10)
                p.start()
                process_list.append(p)
            for j in process_list:
                j.join()
        
        if __name__ == '__main__':
            print("当前主进程id:",os.getpid())
            call_Sub1()
            print("计算结束!")

        到此这篇关于python中的多进程的创建与启动的文章就介绍到这了,更多相关python多进程创建与启动内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

        0

        精彩评论

        暂无评论...
        验证码 换一张
        取 消

        关注公众号