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

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

时间:2024-10-10 22:20:26浏览次数:16  
标签:__ 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 类篇
    目录2.类实例属性和类属性构造函数和self参数类方法静态方法共有私有[待补充]3.继承单继承多继承super函数MRO列表super的本质经典类和新式类4.多态C++多态的定义python多态鸭子类型5.虚函数null2.类面向对象的三个特点,封装,继承,多态。其中封装指的是将函数和数据封在一起形......
  • [档] python 多环境管理-vene
    python创建虚拟环境虚拟环境相当于单独隔离出一套独立的环境,你可以在这个环境中安装各种包,继而构建各种不同的具体的环境。类似于docker或早先的虚拟机。当有多个不同的项目,不同的项目依赖的python库或者python的不同版本,此时就可以使用多环境管理,创建虚拟环境,为不同的项目构造......
  • python 图片转icon图标
    功能分析Tkinter:用于构建简单的GUI,包括文件选择按钮、下拉菜单和生成按钮。Pillow(PIL):用于处理图像加载、调整尺寸并保存为.ico格式。功能实现:用户点击“选择图片”按钮,打开文件对话框选择图片。下拉菜单用于选择图标的尺寸(16x16到256x256)。用户点击“生成图标”按......
  • 基于yolov8、yolov5的安全帽检测系统(含UI界面、数据集、训练好的模型、Python代码)
    项目介绍项目中所用到的算法模型和数据集等信息如下:算法模型:  yolov8、yolov8+SE注意力机制或yolov5、yolov5+SE注意力机制,直接提供最少两个训练好的模型。模型十分重要,因为有些同学的电脑没有GPU,无法自行训练。数据集:  网上下载的数据集,格式都已......
  • 学习python2.0
    这两天白天都满课,傍晚才有私人时间。今天学习了5.2字符串和编码:(1)ASCII,可以编码的是英文字母,数字和一些符号。GB2312编码,可以编码中文。Unicode把所有语言都统一到一套编码里,比较方便,但是占用的存储空间大。UTF-8编码可以省空间。(2)ord()函数获取字符的整数表示,chr()......
  • ARC136C Circular Addition [高维前缀和]
    Description给定一个长度为\(n\)的正整数序列\(A\),求有多少对\((i,j)\)使得\(A_i+A_j\)不发生进位操作。\(A_i<10^6\)。Solution显然对于每个\(A_i\),设\(B_i=999999-A_i\),那么\(A_i\)可以和所有位上的数都小于等于\(B_i\)对应位上的数的数匹配,考虑用桶加前缀......
  • Python:条件分支 if 语句全讲解
    Python:条件分支if语句全讲解如果我拿出下面的代码,阁下该做何应对?ifnotreset_excutedand(terminatedortruncated): ...else:...----前言:消化论文代码的时候看到这个东西直接大脑冻结,没想过会在这么基础的东西上犯难看完即便是冰之勇者也能学会大概吧本......
  • python 图片压缩
    '''pipinstallpillow'''fromioimportBytesIOfromPILimportImagedefpic_compress(pic_path,out_path,target_size,quality=90,step=5):#读取图片byteswithopen(pic_path,'rb')asf:pic_byte......
  • SCIE1000 Python and Communication
    SCIE1000Semester2,2024PythonandCommunicationAssignment1ThescenarioAnewpublicsciencemuseuminStLuciaisdevelopinganexhibit.Afeatureofthemuseumisthateachexhibititemisaccompaniedbytwoexplanations,eachwrittenforadiffe......