zoukankan      html  css  js  c++  java
  • 多任务

    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调度的单位

      • 关系

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

      • 稳定性

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

    • 优缺点对比:

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

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

  • 相关阅读:
    模式应用:自定义匹配
    WPF架构学习总结
    脑子是用来想事的,不是记事的
    参加峰会“金点子”的材料
    我所想的GIX4的权限
    Process, Thread, STA, MTA, COM object
    JAVA 游戏分享 “是男人就下100层”
    关于静态方法和实例方法的一些误区。
    软区域
    Dispose, Finalization, and Resource Management
  • 原文地址:https://www.cnblogs.com/zhangwei112/p/13586401.html
Copyright © 2011-2022 走看看