Python 从入门到实战36(进程-Process、Pool类)

        我们的目标是:通过这一套资料学习下来,可以熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。

        上篇文章我们讨论了通过multiprocessing模块创建进程操作的相关知识。今天学习一下Process 、Pool类方式创建进程。

1、使用Process 子类创建进程

对于一些简单的小任务,通常使用Process(target=test)方式实现多进程。若是要处理复杂任务的进程,通常定义一个类使其继承Process类。每次实例化这个类时,就等同于实例化一个进程对象。

举例如下:使用Process子类方式创建两个子进程,分别输出父、子进程的ID等

#继承Process
class SubProcess(Process):

    def __init__(self,interval,name=""):  #
重写父类的__init__()方法
        Process.__init__(self)
        self.interval = interval
        if name:
            self.name = name #
若传递name不为空,则为子进程创建name属性,否则使用默认属性
    def run(self):    #重写了Process类的run()方法
        print("子进程(%s)开始执行,父进程为(%s" % (os.getpid(), os.getppid()))  # 打印子进程pid,父进程pid
        t_start = time.time()  #
计时开始
        time.sleep(self.interval)  # 程序将会被挂起interval
        t_end = time.time()  # 计时结束
        print("子进程(%s)执行时间为'%0.2f'" % (os.getpid(), t_end - t_start))  # 子进程执行时间

#执行主程序
def main():
    print("********父进程执行开始********")
    print("父进程的PID:%s"%os.getpid())  #输出当前程序的pid
    process1 = SubProcess(interval=1,name="test") #实例化进程1,挂起时间1
    process2 = SubProcess(interval=2)#
实例化进程2
    #对于一个不包含target属性的Process 类执行start()方法,就会运行这个类中的run()方法
    process1.start() #启动进程1,会执行p1.run()
    process2.start() #启动进程2

    #父进程继续执行,如果子进程还在执行则返回True,否在返回False
    print("process1.is_alive=%s"%process1.is_alive())
    print("process2.is_alive=%s"%process1.is_alive())

    #输出子进程的别名和PID
    print("process1.name=%s"%process1.name)   #按照默认设定的名字,展示Process-1
    print("process1.pid=%s" % process1.pid)
    print("process2.name=%s" % process2.name) #按照我们设定的名字,展示p2name
    print("process2.pid=%s" % process2.pid)

    print("********等待子进程********")
    process1.join()#等待子进程1结束
    process2.join()
    print("********父进程执行结束********")
if __name__=="__main__":
    main()

主要标黄的部分和之前有差别,其它和上个例子类似。

输出结果参考:

2、使用Pool创建进程

上面介绍的通过Process 子类创建进程。若是要创建几十或者几百进程就比较麻烦了。

有没有一下创建多个进程的方法呢?可以Pool类来创建进程池。

Pool类的常用方法:

apply(func[, args[, kwds]]) 使用阻塞方式调用func函数。

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

close():关闭Pool,使其不再接受新的任务;

terminate():不管任务是否完成,立即终止;

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

举例参考:

import os
import time
from multiprocessing import Pool
#模拟创建最大进程数3,然后非阻塞方式执行11个任务
#子进程任务
def tasks(name):
    print("
子进程(%s)执行 %s,,,,"%(os.getpid(),name))
    time.sleep(2)  #
休眠2s

def main():
    print("父进程 的PID :%s。"%os.getpid())
    p = Pool(3) #定义一个进程池,最大进程数3

    for j in range(11):   #循环执行11个任务
        p.apply_async(tasks,args=(j,))  #使用非阻塞方式调用tasks()函数
    print("等待子进程结束")
    p.close()      #关闭进程池,关闭后p不在接收新的请求
    p.join()       #等待子进程结束

    print("所有子进程结束。")

if __name__=="__main__":
    main()

输出参考:

今天先写学习到这里了,每天进步一点点。明天也要加油啊!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

立黄昏粥可温

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值