Java教程

多进程的三种实现方式

本文主要是介绍多进程的三种实现方式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、多进程的创建方式

  1、通过multiprocessing

#encoding='utf-8'
from multiprocessing import Process
import os
import time

'''
os.getpid()
获取一个进程的pid
返回当前进程的pid

os.getppid()
获取父进程的pid
返回父进程的pid
'''


'''
Process类的实例常用的属性和方法有:
name :           当前进程的实例别名,默认为Process-N ,N为从1开始递增的整数
pid:             当前进程实例的pid
is_alive():      判断进程实例是否还在执行
join([timeout]): 是否等待进程实例执行结束,或等待多少秒
start():         启动进程实例(创建子进程)
run():           如果没有给定target参数,对这个对象调用start()方法时,就将执行对象中的run()方法
terminate():     不管任务是否完成,立即终止
'''



def child_1(interval):
    print("子进程(%s)开始执行,父进程为(%s)" %(os.getpid(),os.getppid()))
    t_start = time.time()
    time.sleep(interval)
    t_end = time.time()
    print("子进程(%s)执行时间为'%0.2f'秒" % (os.getpid(),t_end-t_start))

def child_2(interval):
    print("子进程(%s)开始执行,父进程为(%s)" % (os.getpid(), os.getppid()))
    t_start = time.time()
    time.sleep(interval)
    t_end = time.time()
    print("子进程(%s)执行时间为'%0.2f'秒" % (os.getpid(), t_end - t_start))

if __name__ == '__main__':
    print("----父进程开始执行----")
    print("父进程PID:%s" % os.getpid())
    p1 = Process(target=child_1,args=(1,))
    p2 = Process(target=child_1,name="test",args=(2,))
    p1.start()
    p2.start()

    print("p1.is_alive = %s" % p1.is_alive())
    print("p2.is_alive = %s" % p2.is_alive())

    print("p1.name = %s" % p1.name)
    print("p1.pid = %s" % p1.pid)
    print("p2.name = %s" % p2.name)
    print("p2.pid = %s" % p2.pid)

    print("----等待子进程----")
    p1.join()
    p2.join()
    print("----父进程结束---")

  

  

        

 

 

 

  2、继承Process

  

#encoding=utf-8
from multiprocessing import Process
import time
import os

class SubProcess(Process):
    def __init__(self, interval, name=''):
        Process.__init__(self)      # 调用父类的初始化方法
        self.interval = interval
        if name:
            self.name = name

    # 重写 run() 方法
    def run(self):
        print("子进程 (%s) 开始执行,父进程为 (%s)" % (os.getpid(), os.getppid()))
        t_start = time.time()
        time.sleep(self.interval)
        t_end = time.time()
        print("子进程 (%s) 执行结束,耗时%0.2f秒" % (os.getpid(), t_end - t_start))

if __name__ == '__main__':
    print("---父进程开始执行---")
    print("父进程 PID: %s" % os.getpid())
    p1 = SubProcess(interval=1, name='test')
    p2 = SubProcess(interval=2)
    p1.start()  # 对一个不包含 target 属性的 Process 类执行 start() 方法,就会运行这个类中的 run() 方法
    p2.start()

    print("p1.is_alive = %s" % p1.is_alive())
    print("p2.is_alive = %s" % p2.is_alive())

    print("p1.name = %s" % p1.name)
    print("p1.pid = %s" % p1.pid)
    print("p2.name = %s" % p2.name)
    print("p2.pid = %s" % p2.pid)

    print("---等待子进程---")
    p1.join()
    p2.join()
    print("---父进程执行结束---")

  

      

 

   3、使用进程池 Pool 创建进程

 

  

#encoding=utf-8
from multiprocessing import Pool
import time
import os


'''
Pool常用方法
apply_async(func[, args[, kwds]]) : 
    使用非阻塞方式调用 
    func 函数(并行执行,堵塞方式必须等待上一个进程退出才能执行下一个进程),
    args 为传递给 
    func 的参数列表,
    kwds 为传递给 func 的关键字参数列表

apply(func[, args[, kwds]]):
    使用阻塞方式调用 func 函数
    
close() :
    关闭 Pool,使其不再接受新的任务
    
terminate():
    不管任务是否完成,立即终止

join():
    主进程阻塞,等待子进程的退出,必须在 close 或 terminate 之后使用
'''


def task(name):
    print("子进程 (%s) 开始执行 task %s..." % (os.getpid(), name))
    time.sleep(1)       # 休眠 1 秒

if __name__ == '__main__':
    print("---父进程开始执行---")
    print("父进程 PID: %s" % os.getpid())
    p = Pool(3)         # 定义一个进程池,最大进程数为 3
    for i in range(10):
        p.apply_async(task, args=(i,))  # 使用非阻塞方式调用 task() 函数

    print("等待所有子进程结束")
    p.close()
    p.join()
    print("---父进程执行结束---")

  

 

 

 

 

 

 

 

 

 

 

  

这篇关于多进程的三种实现方式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!