• Python大数据之Python进阶(三)多进程的使用


    多进程的使用

    学习目标

    • 能够使用多进程完成多任务

    1 导入进程包

    #导入进程包
    import multiprocessingCopy
    
    • 1
    • 2

    2. Process进程类的说明

    Process(group,target,name,args,kwargs)

    • group:指定进程组,目前只能使用None
    • target:执行的目标任务名
    • name:进程名字
    • args:以元组方式给执行任务传参
    • kwargs: 以字典方式给执行任务传参

    Process创建的实例对象的常用方法:

    • start():启动子进程实例(创建子进程)
    • join():等待子进程执行结束
    • terminate():不管任务是否完成,立即终止子进程

    Process创建的实例对象的常用属性:

    name:当前进程的别名,默认为Process-N,N为从1开始递增的整数

    3. 多进程完成多任务的代码

    import multiprocessing
    import time
    
    
    # 跳舞任务
    def dance():
        for i in range(5):
            print("跳舞中...")
            time.sleep(0.2)
    
    
    # 唱歌任务
    def sing():
        for i in range(5):
            print("唱歌中...")
            time.sleep(0.2)
    
    if __name__ == '__main__':
        # 创建跳舞的子进程
        # group: 表示进程组,目前只能使用None
        # target: 表示执行的目标任务名(函数名、方法名)
        # name: 进程名称, 默认是Process-1, .....
        dance_process = multiprocessing.Process(target=dance, name="myprocess1")
        sing_process = multiprocessing.Process(target=sing)
    
        # 启动子进程执行对应的任务
        dance_process.start()
        sing_process.start()Copy
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    执行结果:

    唱歌中...
    跳舞中...
    唱歌中...
    跳舞中...
    唱歌中...
    跳舞中...
    唱歌中...
    跳舞中...
    唱歌中...
    跳舞中...Copy
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    4. 小结

    1. 导入进程包
      • import multiprocessing
    2. 创建子进程并指定执行的任务
      • sub_process = multiprocessing.Process (target=任务名)
    3. 启动进程执行任务
      • sub_process.start()

    获取进程编号

    学习目标

    • 能够知道如果获取进程编号

    1. 获取进程编号的目的

    获取进程编号的目的是验证主进程和子进程的关系,可以得知子进程是由那个主进程创建出来的。

    获取进程编号的两种操作

    • 获取当前进程编号
    • 获取当前父进程编号

    2. 获取当前进程编号

    os.getpid() 表示获取当前进程编号

    示例代码:

    import multiprocessing
    import time
    import os
    
    
    # 跳舞任务
    def dance():
        # 获取当前进程的编号
        print("dance:", os.getpid())
        # 获取当前进程
        print("dance:", multiprocessing.current_process())
        for i in range(5):
            print("跳舞中...")
            time.sleep(0.2)
    
    
    # 唱歌任务
    def sing():
        # 获取当前进程的编号
        print("sing:", os.getpid())
        # 获取当前进程
        print("sing:", multiprocessing.current_process())
        for i in range(5):
            print("唱歌中...")
            time.sleep(0.2)
    
    
    if __name__ == '__main__':
    
        # 获取当前进程的编号
        print("main:", os.getpid())
        # 获取当前进程
        print("main:", multiprocessing.current_process())
        # 创建跳舞的子进程
        # group: 表示进程组,目前只能使用None
        # target: 表示执行的目标任务名(函数名、方法名)
        # name: 进程名称, 默认是Process-1, .....
        dance_process = multiprocessing.Process(target=dance, name="myprocess1")
        sing_process = multiprocessing.Process(target=sing)
    
        # 启动子进程执行对应的任务
        dance_process.start()
        sing_process.start()Copy
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    执行结果:

    main: 70763
    main: <_MainProcess(MainProcess, started)>
    dance: 70768
    dance: <Process(myprocess1, started)>
    跳舞中...
    sing: 70769
    sing: <Process(Process-2, started)>
    唱歌中...
    唱歌中...
    唱歌中...
    唱歌中...
    唱歌中...Copy
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3. 获取当前父进程编号

    os.getppid() 表示获取当前父进程编号

    示例代码:

    import multiprocessing
    import time
    import os
    
    
    # 跳舞任务
    def dance():
        # 获取当前进程的编号
        print("dance:", os.getpid())
        # 获取当前进程
        print("dance:", multiprocessing.current_process())
        # 获取父进程的编号
        print("dance的父进程编号:", os.getppid())
        for i in range(5):
            print("跳舞中...")
            time.sleep(0.2)
            # 扩展:根据进程编号杀死指定进程
            os.kill(os.getpid(), 9)
    
    
    # 唱歌任务
    def sing():
        # 获取当前进程的编号
        print("sing:", os.getpid())
        # 获取当前进程
        print("sing:", multiprocessing.current_process())
        # 获取父进程的编号
        print("sing的父进程编号:", os.getppid())
        for i in range(5):
            print("唱歌中...")
            time.sleep(0.2)
    
    
    if __name__ == '__main__':
    
        # 获取当前进程的编号
        print("main:", os.getpid())
        # 获取当前进程
        print("main:", multiprocessing.current_process())
        # 创建跳舞的子进程
        # group: 表示进程组,目前只能使用None
        # target: 表示执行的目标任务名(函数名、方法名)
        # name: 进程名称, 默认是Process-1, .....
        dance_process = multiprocessing.Process(target=dance, name="myprocess1")
        sing_process = multiprocessing.Process(target=sing)
    
        # 启动子进程执行对应的任务
        dance_process.start()
        sing_process.start()Copy
    main: 70860
    main: <_MainProcess(MainProcess, started)>
    dance: 70861
    dance: <Process(myprocess1, started)>
    dance的父进程编号: 70860
    跳舞中...
    sing: 70862
    sing: <Process(Process-2, started)>
    sing的父进程编号: 70860
    唱歌中...
    唱歌中...
    唱歌中...
    唱歌中...
    唱歌中...Copy
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    4. 小结

    • 获取当前进程编号
      • os.getpid()
    • 获取当前父进程编号
      • os.getppid()
    • 获取进程编号可以查看父子进程的关系

    进程执行带有参数的任务

    学习目标

    • 能够写出进程执行带有参数的任务

    1. 进程执行带有参数的任务的介绍

    前面我们使用进程执行的任务是没有参数的,假如我们使用进程执行的任务带有参数,如何给函数传参呢?

    Process类执行任务并给任务传参数有两种方式:

    • args 表示以元组的方式给执行任务传参
    • kwargs 表示以字典方式给执行任务传参

    2. args参数的使用

    示例代码:

    import multiprocessing
    import time
    
    
    # 带有参数的任务
    def task(count):
        for i in range(count):
            print("任务执行中..")
            time.sleep(0.2)
        else:
            print("任务执行完成")
    
    
    if __name__ == '__main__':
        # 创建子进程
        # args: 以元组的方式给任务传入参数
        sub_process = multiprocessing.Process(target=task, args=(5,))
        sub_process.start()Copy
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    执行结果:

    任务执行中..
    任务执行中..
    任务执行中..
    任务执行中..
    任务执行中..
    任务执行完成Copy
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3. kwargs参数的使用

    示例代码:

    import multiprocessing
    import time
    
    
    # 带有参数的任务
    def task(count):
        for i in range(count):
            print("任务执行中..")
            time.sleep(0.2)
        else:
            print("任务执行完成")
    
    
    if __name__ == '__main__':
        # 创建子进程
    
        # kwargs: 表示以字典方式传入参数
        sub_process = multiprocessing.Process(target=task, kwargs={"count": 3})
        sub_process.start()Copy
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    执行结果:

    任务执行中..
    任务执行中..
    任务执行中..
    任务执行完成Copy
    
    • 1
    • 2
    • 3
    • 4

    4. 小结

    • 进程执行任务并传参有两种方式:
      • 元组方式传参(args): 元组方式传参一定要和参数的顺序保持一致。
      • 字典方式传参(kwargs): 字典方式传参字典中的key一定要和参数名保持一致。
  • 相关阅读:
    目的:ubuntu配置使用opengl - 初探-创建一个空窗口
    云表:“智、数”结合,低代码赋能制造业,入局者赢
    Angular tsconfig.json 文件里的 paths 用途
    简单谈谈云服务器私网IP的存在意义及优势
    Linux系统上使用SQLite
    [附源码]Python计算机毕业设计Django面向高校活动聚App
    国产自研、安全、高可用——袋鼠云大数据基础平台EasyMR筑基企业数字化转型
    机械硬盘,Win10系统,磁盘100%
    paddleocr有效关闭log日志打印输出
    使用python来访问Hadoop HDFS存储实现文件的操作
  • 原文地址:https://blog.csdn.net/xianyu120/article/details/133386960