线程

作者: 遇明不散 | 来源:发表于2019-02-27 20:00 被阅读0次

    线程

    • 线程也可以使用计算机的多核资源,也是多任务编程方式之一。
    • 线程又称为轻量级的进程,在并发上和进程相同但是在创建时消耗资源少。
    • 一个进程中可以包含多个线程,这些线程共享进程的资源。
    • 多个线程因为共享进程的资源,所在通信上往往采用全局变量的方法
    • 线程也拥有自己特有的资源,比如TID,指令集等

    多进程与多线的区别和联系

    • 多进程和多线程都是多任务编程方法,都可以使用计算机多核
    • 进程的创建要比线程消耗更多的资源
    • 进程空间独立数据更安全,有专门的的进程间通信方式进行交互
    • 一个进程包含多个线程,所以线程共享进程资源,没有专门的通信方法,依赖全局变量进行通信。往往需要使用同步互斥机制,逻辑需要思考更多。
    • 进程线程都有自己特定的资源。多个关联任务的时候使用多线程资源消耗更少,如果是多个无关任务也不适于全使用线程。

    创建线程

    import threading

    • 创建线程函数threading.Tread()
      • 功能:创建线程
      • 参数:
        target 线程函数
        args 以元组的方式给线程函数传参
        kwargs 以字典方式给线程函数传参
        name 线程名称
      • 返回值:返回线程对线
      • t.start() 启动一个线程
      • t.is_alive() 查看一个线程的状态
      • t.name 查看线程的名称
      • t.join(sec) 阻塞等待回收线程
      • daemon 属性
        该属性默认为False,主线程执行完毕不会影响到其他线程的执行;如果设置为True,则主线程执行完毕其他线程也会终止执行。
        t.setDaemon(True)t.daemon = True 设置daemon属性
        t.isDaemon() 获取daemon属性值

    线程间的通信

    全局变量

    线程的同步与互斥

    线程event
    • e.wait(timeout) 如果e被设置则不会阻塞,未被设置则阻塞,timeout为超时阻塞时间
    • e.set()e变为设置的状态
    • e.clear()e变为未设置的状态
    线程锁

    threading.Lock()

    • lock.acquire() 上锁
    • lock.release() 解锁

    创建自己的线程类

    • 自定义类继承于原有线程类
    • 复写原有的run方法
    • 创建线程对线调用start的时候会自动执行run

    线程池模块

    第三方模块:threadpool
    安装线程池模块:sudo pip3 install threadpool

    全局解释器锁(GIL)

    • python -> 支持多线程 -> 同步和互斥 -> 加锁 -> 超级锁 -> 解释器在同一时刻只能解释一个线程
    • 大量python库为了省事依赖于这种机制 -> python多线程效率低
    • GIL即为从python解释器由于上锁带来的同一个时刻只能解释一个线程的问题
    • 解决方案:
      • 不使用线程,转而使用进程
      • 不使用C作为解释器,Java,C#都可以做python解释器
    • 两种程序
      • IO密集型
        • 程序中进行了大量IO操作,只有少量的CPU操作
        • 在内存中进行了数据的交换的操作都可以认为是IO操作
        • 特点
          速度较慢,使用CPU不高
      • CPU密集型(计算密集型)
        • 大量的程序都在进行运算操作
        • 特点
          CPU占有率高

    效率测试

    • 多线程的工作效率和单线程几乎相近
    • 多进程要比单线程和多进程有明显的效率提升

    设计模式

    设计模式代表了一种最佳实践,是被开发人员长期开发总结,用来解决某一类问题的思路方法。这些方法保证了代码的效率也易于理解。

    生产者消费者模式
    • 高内聚:在同一模块内,实现单一功能,尽量不使功能混杂。
    • 低耦合:不同的模块之间尽量互相独立,减少模块间的影响。

    问题

    • 进程和线程的区别
    • 什么是同步和互斥?
    • 给一个具体的情况,问采用进程还是线程?为什么?
    • 如何处理僵尸进程?
    • 如何测试一个硬盘的读写速度?
    • xxx框架用的多进程还是多线程并发?
    • 进程间通信方式有哪些?各自有什么特点?

    相关文章

      网友评论

          本文标题:线程

          本文链接:https://www.haomeiwen.com/subject/miffuqtx.html