14.高级语法(6)

多线程 vs 多进程

  • 进程:每个进程有自己的完全独立的运行环境,多进程共享数据
  • 线程:
    • 一个进程有多个线程
    • 一个进程的多个线程之间共享数据和上下文环境
    • 共享互斥问题
  • 全局解释性
    • Python代码的执行是由python虚拟机进行控制
    • 在主循环中只能有一个控制线程在之执行
  • thread包
    • thread.start_new_thread():启动一个线程
  • threading
    • t = threading.Thread(target=xxx,args=(xxx,)):生成实例
    • t.start():启动多线程
    • t.join():等待多线程执行完成
  • 守护线程
    • 如果在程序中将子线程设置成守护线程,则子线程会在主线程结束的时候自动退出
    • 一般认为守护线程不重要或者不允许离开主线程独立运行
    • 设置守护线程:t.setDaemon(True),必须在start之前设置,否则无效
  • 线程常用属性
    • threading.currentThread :返回当前线程变量
    • threading.enumerate:返回一个包含当前正在运行线程的list
    • threading.activeCount:返回正在运行的线程数量
    • t.setName:给线程设置名字
    • t.getNamer:获取线程名字
  • 继承threading.Thread
    • 需要重写run方法
    • 可以不写__ init _ ,但是一旦写了就必须执行super(). __ init __ ()

共享变量

  • 多个线程同时访问一个变量的时候,产生问题
  • 解决方法:锁、信号灯

  • 一个标志,表示一个线程正在占用一些资源
  • 使用方法:
    • lock = threading.Lock():生成锁实例
    • 上锁:lock.acquire()
    • 使用资源:
    • 解锁:lock.release()

线程安全问题

  • 如果一个资源对于多线程不用加锁也不会有安全问题,则称为线程安全问题
  • 线程不安全变量类型:list、set、dict
  • 线程安全变量类型:queue

生产者消费者问题

  • 消息队列

死锁问题

锁的等待时间问题

Semaphore

  • 允许一个资源最多有几个线程同时使用
    • threading.Semaphore()

threading.Timer

  • 在指定时间后启动一个功能

可重入锁

  • t = threading.RLock()
  • 同一个锁,可以被一个线程多次申请
  • 主要解决递归调用的时候重复申请锁的情况

线程替代方案

  • subprocess
    • 完全跳过线程,使用进程
    • 是派生进程的主要替代方案
  • multiprocessing
    • 使用threading接口派生,使用子进程
    • 允许为多核或者多CPU派生进程,接口和threading非常相似
  • concurren.futures
    • 新的一步执行模块
    • 任务级别的操作

多进程

  • 进程间通讯
  • 进程之间无任何网共享状态

进程的创建

  • 直接生成Process实例对象
  • 派生multiprocessing.Process的子类
  • os.pid查看子进程的ID
  • os.ppid查看父进程的ID
  • 生产者消费者模型
    • q = multiprocessing.JoinableQueue()
发布了247 篇原创文章 · 获赞 23 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/LiyangBai/article/details/102999300