首页 > 系统相关 >Python 从入门到实战36(进程-Process、Pool类)

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

时间:2024-10-10 22:20:26浏览次数:17  
标签:__ name Python 36 Process process1 print 进程

        我们的目标是:通过这一套资料学习下来,可以熟练掌握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()

输出参考:

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

标签:__,name,Python,36,Process,process1,print,进程
From: https://blog.csdn.net/weixin_45999406/article/details/142833732

相关文章

  • python第一章试题集(答案全)
    第一题判断题1-1  Python语言是开源的,现拥有十几万个第三方函数库。T1-2  以下代码运行时会出错  T1-3Python中“4”+“3”的结果为“7”。F1-4下面Python程序是错误的.T1-5Python语言可以用面向对象的方法编程。T1-6Python是一种跨平台、开源、免费......
  • python 图片转icon图标
    功能分析Tkinter:用于构建简单的GUI,包括文件选择按钮、下拉菜单和生成按钮。Pillow(PIL):用于处理图像加载、调整尺寸并保存为.ico格式。功能实现:用户点击“选择图片”按钮,打开文件对话框选择图片。下拉菜单用于选择图标的尺寸(16x16到256x256)。用户点击“生成图标”按......
  • 基于yolov8、yolov5的安全帽检测系统(含UI界面、数据集、训练好的模型、Python代码)
    项目介绍项目中所用到的算法模型和数据集等信息如下:算法模型:  yolov8、yolov8+SE注意力机制或yolov5、yolov5+SE注意力机制,直接提供最少两个训练好的模型。模型十分重要,因为有些同学的电脑没有GPU,无法自行训练。数据集:  网上下载的数据集,格式都已......