• Python多进程


    并发和并行的区别

    并发指的是,假如单核的cpu,要同时运行多个任务,这个时候就需要不断的切换任务,只是切换的比较快,没有分辨出来。

    并行,是假如是2核的cpu,有两个任务要运行,一个cpu执行一个任务,这个时候两个任务同时运行,就是并行。

    可以使用多进程和多线程,完成多任务

    一、多进程完成多任务

    进程的创建步骤

    1、导入进程包

    import multiprocessing

    2、通过进程类创建进程对象

    进程对象 = multiprocessing.Processing(target=任务名)

    参数名 说明

    target 执行的目标任务名,这里指的是函数名(方法名)

    name 进程名,一般不用设置

    group 进程组,目前只能使用None

    3、启动进程执行任务

    进程对象.start()

    单进程写法

    1. import time
    2. import multiprocessing
    3. def sing():
    4. for i in range(3):
    5. print("唱歌....")
    6. time.sleep(0.5)
    7. def dance():
    8. for i in range(3):
    9. print("跳舞.....")
    10. time.sleep(0.5)
    11. if __name__ == '__main__':
    12. sing()
    13. dance()

    多进程写法

    1. import time
    2. import multiprocessing
    3. def sing():
    4. for i in range(3):
    5. print("唱歌....")
    6. time.sleep(0.5)
    7. def dance():
    8. for i in range(3):
    9. print("跳舞.....")
    10. time.sleep(0.5)
    11. if __name__ == '__main__':
    12. sing_process = multiprocessing.Process(target=sing)
    13. dance_process = multiprocessing.Process(target=dance)
    14. sing_process.start()
    15. dance_process.start()

    二、进程执行带有参数的任务

    参数名       说明

    args           以元组的方式给执行的任务传参

    kwargs       以字典的方式给执行任务传参

    1、args 参数的使用

    sing_process = multiprocessing.Process(target=sing, args=(3,))

    sing_process.start()

    元组的顺序,要与参数顺序一致

    2、kwargs参数的使用

    dance_process = multiprocessing.Process(target=dance, kwargs={"num": 3})

    dance_process.start()

    字典的key 要与参数一致

    1. import time
    2. import multiprocessing
    3. def sing(num):
    4. for i in range(num):
    5. print("唱歌....")
    6. time.sleep(0.5)
    7. def dance(num):
    8. for i in range(num):
    9. print("跳舞.....")
    10. time.sleep(0.5)
    11. if __name__ == '__main__':
    12. sing_process = multiprocessing.Process(target=sing, args=(3,))
    13. dance_process = multiprocessing.Process(target=dance, kwargs={"num": 4})
    14. sing_process.start()
    15. dance_process.start()

    三、获取进程的编号

    1、获取当前进程编号

    os.getpid()

    1. import os
    2. pid = os.getpid()
    3. print(pid)

    2、获取当前父进程编号

    os.getppid()

    1. import os
    2. ppid = os.getppid()
    3. print(ppid)

    四、多进程的注意点

    1、主进程默认会等待所有的子进程执行结束再结束,保证子进程都结束掉

    1. import time
    2. import multiprocessing
    3. def work():
    4. for i in range(10):
    5. print("工作中")
    6. time.sleep(0.2)
    7. if __name__ == '__main__':
    8. work_process = multiprocessing.Process(target=work)
    9. work_process.start()
    10. # 主进程失眠1秒
    11. time.sleep(1)
    12. print("主进程执行完成......")
    13. # 工作中
    14. # 工作中
    15. # 工作中
    16. # 主进程执行完成......
    17. # 工作中
    18. # 工作中
    19. # 工作中
    20. # 工作中
    21. # 工作中
    22. # 工作中
    23. # 工作中

    2、子进程设置守护主进程,一旦主进程结束,所有的子进程自动销毁

    增加一行代码

    work_process.daemon = True

    1. import time
    2. import multiprocessing
    3. def work():
    4. for i in range(10):
    5. print("工作中")
    6. time.sleep(0.2)
    7. if __name__ == '__main__':
    8. work_process = multiprocessing.Process(target=work)
    9. work_process.daemon = True
    10. work_process.start()
    11. # 主进程失眠1秒
    12. time.sleep(1)
    13. print("主进程执行完成......")
    14. # 工作中
    15. # 工作中
    16. # 工作中
    17. # 工作中
    18. # 工作中
    19. # 主进程执行完成......

    总结:

    为了保证子进程能够正常的运行,主进程会等所有的子进程执行完成以后再销毁,设置守护主进程的目的是主进程退出子进程销毁,不让主进程再等待子进程去执行。

    设置守护主进程方式:子进程对象.daemon = True

  • 相关阅读:
    【JavaWeb】JSP学习笔记
    Allegro172版本DFM功能介绍
    java之Fork/Join框架
    四旋翼飞行器控制和路径规划附Matlab代码
    使用SDKMAN在Linux系统上安装JDK
    温湿度传感器原理介绍
    Netapp数据恢复—Netapp存储误删除lun的数据恢复过程
    BUUCTF---misc---[SWPU2019]我有一只马里奥
    基于rest_framework的ModelViewSet类编写登录视图和认证视图
    pipenv使用
  • 原文地址:https://blog.csdn.net/qq_30353203/article/details/125268474