多任务

6. [了解]多任务的介绍

  • 概念:同一时间执行多个任务

  • 多任务执行方式:

    • 并发:多个任务交替执行

    • 并行:多个任务同时执行

7. [重点]进程

  • 概念:操作系统资源分配的基本单位

  • 作用:python语言中,可以使用多进程实现多任务。

8. [重点]多进程的使用

  • 进程使用的步骤:

    • 导入模块

      import multiprocessing
    • 创建子进程对象

      进程对象 = multiprocessing.Process(target=函数名)
    • 启动子进程

      进程对象.start()

9. [重点]获取进程编号

  • 获取进程的对象

    multiprocessing.current_process()
  • 获取进程的编号

    import os

    os.getpid()
  • 获取进程的父进程编号

    os.getppid()
  • 杀死进程

    os.kill(进程编号,信号编号)

10. [重点]进程执行带有参数的任务

  • 进程的参数传递

    • 元组传递参数: args=(参数1,参数2, ....)

    • 字典传递参数: kwargs={"参数名": 值, “参数名”: 值}

      # 2.创建进程对象
      # 2.1 启动带参数的任务,需要创建进程对象时给对象传递参数
      #   1)使用元组传递参数 args=(参数1,参数2,....) 按照顺序传递给任务函数
      # sub_process = multiprocessing.Process(target=foo, args=(5,))
      #   2) 使用字典传递参数 kwargs={"key":value} 按照任务的参数名字传递参数,key是任务的参数名字

      sing_process = multiprocessing.Process(target=sing, args=(3, "laowang"))
      dance_process = multiprocessing.Process(target=dance, kwargs={"name": "xiaoming", "count": 4})

11. [重点]进程的注意点

  • 全局变量问题:

    多个进程之间不能共享全局变量

  • 等待子进程:

    主进程会等待子进程结束后再结束

  • 主进程结束时,所有子进程销毁

    • 守护进程:

      子进程对象.daemon = True

    • 子进程结束:

      子进程对象.terminate()

12. [重点]线程

  • 概念: cpu调度的基本单位(进程中干活的人)

    • 一个py文件是一个程序

    • 一个运行起来的程序就是进程

    • 一个进程中至少会有一个线程

    • 真正执行代码的单元就是线程(cpu调度的基本单位)

  • 作用:

    • 实现多任务的方法之一

13. [重点]多线程的使用

  • 导入模块

    import threading
  • 创建线程对象

    线程对象 = threading.Thread(target=任务名)
  • 启动线程

    线程对象.start()

 

14. [重点]线程执行带有参数的任务

  • 返回线程对象:

    threading.current_thread()
  • 线程执行带参数的任务:

    • 元组方式:args=(3, )

      # 2.创建线程对象
      #   2.1 启动带参数的任务
      #       1)元组传递参数 args=(5,) 按照顺序传递
      #       2) 字典方式传递参数 kwargs={"count":5} 按照key名作为参数名传递
      sing_thread = threading.Thread(target=sing, args=(3,))
    • 字典方式:kwargs={"count": 4}

      dance_thread = threading.Thread(target=dance, kwargs={"count": 4})

15. [重点]线程的注意点

  • 线程的执行顺序:无序

  • 主线程会等待所有子线程结束:再结束

  • 守护线程:需求: 主线程结束时,所有子线程也结束

    • 1.threading.Thread(target=task, daemon=True)
      2.子线程对象.setDaemon(True)
      3.子线程对象.daemon = True

 

16. [重点]线程的注意点

  • 多线程之间共享全局变量:共享全局

  • 共享全局变量的问题:多线程出现资源竞争

    • 解决办法:

      • join

      • 互斥锁

17. [重点]互斥锁

  • 概念:保护公共资源,保证同一时间只有一个线程访问。

  • 使用:

    • 创建锁:mutex = threading.Lock()

    • 上锁:mutex.acquire()

    • 解锁:mutex.release()

18. [重点]死锁

  • 概念:一直等待对方释放锁的场景叫死锁

  • 避免死锁:在合适的地方释放锁

 

19. [重点]进程和线程对比

  • 关系对比:线程依附进程,一个进程至少一个线程,也可以有多个线程

  • 区别对比:

    • 全局变量:

      • 进程不能共享全局变量

      • 线程可以共享全局变量,但是会出现资源竞争问题,可以使用join和互斥锁解决

    • 开销上:

      • 进程开销大于线程

    • 概念

      • 进程是操作系统资源分配的基本单位。

      • 线程是cpu调度的单位

    • 关系

      • 线程依附进程,没有进程就没有线程,不能单独存在

    • 稳定性

      • 多进程编程比单进程多线程编程稳定性更高

  • 优缺点对比:

    • 进程:可以使用多核,但是开销大

    • 线程:开销小,但是不能使用多核

原文地址:https://www.cnblogs.com/zhangwei112/p/13586401.html