zoukankan      html  css  js  c++  java
  • python-42-Process多进程

    前言

    初识 Process 多进程模块,能够使启动一个主进程的时候会自动创建一个或多个子进程,进程里的第一个进程就是主进程

    程序执行的实例,每一个进程都有唯一的pid,每个子进程的数据都是互相隔离的。就好像Windows操作系统上运行登录一个QQ,那么就是一个进程,开多个登录多个就是多个进程。

    方法:

    • .start():开启一个子进程
    • .join():感知一个子进程的结束
    • .terminate():结束一个子进程
    • .is_alive():查看某个子进程是否还在运行

    同步:只能等待一个事情做完了才能做另一个事情,比如先做完A才能做B。

    异步:并行做多个事情,比如一边做A的事情,同时也在做B的事情。

    一、函数中的多进程

    1、没约束时,不会待进程执行完再执行下面的代码:

    from multiprocessing import Process
    
    def func(arg1,arg2):
        print('arg1:',arg1)
        print('arg2:',arg2)
    
    if __name__ == '__main__':
        p=Process(target=func,args=(5,8))
        p.start()
        print('》》》最后一行代码的打印') # 没约束时,不会待进程执行完再执行下面的代码

    2、join():感知子进程的结束,将异步变为同步。

    # 2、join():感知子进程的结束,将异步变为同步
    from multiprocessing import Process
    
    def func(arg1,arg2):
        print('arg1:',arg1)
        print('arg2:',arg2)
    
    if __name__ == '__main__':
        p=Process(target=func,args=(5,8))
        p.start()
        p.join()        # 感知子进程的结束,将异步变为同步
        print('》》》最后一行代码的打印')

     3、多个子进程执行,列表推导式:必须执行完多个子进程后,再执行下面的代码。

    from multiprocessing import Process
    import time
    
    def func(arg1,arg2):
        print('arg1:',arg1)
        time.sleep(0.1)
        print('arg2:',arg2)
    
    if __name__ == '__main__':
        p_list=[]
        for i in range(5):              # 异步多个子进程执行
            p = Process(target=func, args=(1*i, 10))
            p_list.append(p)
            p.start()
        [p.join() for p in p_list]      # 必须执行完多个子进程后,再执行下面的代码。
        print('哈哈哈!')

     二、类中的多进程

    1、自定义类,继承Process。

    注意:传参数需用继承的方法解决,super().__init__()

    # 4、另一种多进程,自定义类继承Process
    from multiprocessing import Process
    import time
    class My_func(Process):
        def __init__(self,num):
            super().__init__()      # 传参数需用继承的方法解决
            self.num=num
    
        def run(self):
            '''下面多进程要运行的代码'''
            print(self.num)
            time.sleep(0.1)
            print(self.num*self.num)
    if __name__ == '__main__':
        p1=My_func(1)
        p1.start()
        p2=My_func(2)
        p2.start()

     三、守护进程与进程锁

    1、守护进程随着主进程的代码执行完毕而结束:p.daemon=True 

    from multiprocessing import Process
    import time
    def func():
        while 1:
            time.sleep(1)
            print('func1')
    if __name__ == '__main__':
        p=Process(target=func)
        p.daemon=True           # 设置为守护进程
        p.start()
        print(1)
        print(p.is_alive())     # 查看进度是否存在,返回bool
        time.sleep(2)
        # p.terminate()           # 结束一个进程
        print(p.is_alive())
        time.sleep(2)
        print('守护进程随着所有主进程执行后而结束!!')
        print(p.is_alive())

    小结:

    • 守护进程随着主进程的代码执行完毕而结束
    • 在主进程内结束一个子进程调用方法: p.terminate()
    • 结束一个进程不是在执行方法之后立即生效,而是需要操作系统响应的过程
    • 检验一个进程是否存在,调用方法: p.is_alive()
    • 调用属性:p.name p.pid 查看这个进程的名字和进程号

     欢迎来大家QQ交流群一起学习:482713805

  • 相关阅读:
    学习进度条第一周
    构建之法阅读笔记01
    软件工程个人作业01
    《构建之法》阅读笔记
    Day6:闭包函数、无参装饰器
    Day5:函数参数
    Day4:字符编码与文件处理
    Day3:数据类型(布尔值、集合)
    Day2:数据类型(列表、元组、字典)
    Day1:初识Python
  • 原文地址:https://www.cnblogs.com/gsxl/p/12584442.html
Copyright © 2011-2022 走看看