• 并发编程4


    1 GIL

      GIL是一个全局解释器锁,是一种互斥锁

      一个python.exe进程中只有一份解释器,如果职工进程开启了多个线程都要执行代码

        多线程之间要竞争解释器,一旦竞争就会出现问题

      GIL带来的问题是同一时间只有一个线程可以访问解释器

      好处是保证了多线程的数据安全

      thread-safe 线程安全,多个线程同时访问也不会出现问题

      not thread-safe 非线程安全,多个线程同时访问可能出现问题

      GC垃圾回收

      默认情况下一个进程只有一个线程,是不会出现问题的,但是不要忘记还有GC线程一旦出现多个线程就可能出现问题,所以当初就简单粗暴的加上了GIL锁

      由于有GIL的存在即使有多个CPU也不可能真正的并行

      应用程序分为两种

      IO密集型  IO操作较多,纯计算较少  采用多线程

      计算密集型  计算曹军较多,IO操作较少  采用多进程

      当多线程需要共享一个不属于解释器的资源时,必须要自己加锁

    2 线程池,进程池

      池是一种容器

      服务器不可能无限的开线程,所以需要对线程数量加以控制,线程池就是帮我们封装了线程数量的控制,以及线程的创建,销毁,任务分配

      进程池与线程池相同

      特点:
        线程池在创建时不会立即开启线程

        等到提交任务时,如果没有空闲线程并且已存在的线程数量小于最大值时,会新开一条线程

        线程池中的线程开启后就不会关闭了,直到进程全部结束

    3 同步 异步 阻塞 非阻塞

      阻塞:程序运行过程中遇到IO操作,无法继续运行

      非阻塞:程序正在运行中并且没有遇到IO操作,即使遇到IO也不会阻塞,CPU不会切走

      阻塞,非阻塞指的是程序的执行状态

      同步,异步指的是发起任务的方式

      同步:在发起任务后必须在原地等待,任务执行完毕才能继续往下执行

      异步:在发起任务后立即继续往下执行,不需要等待任务的执行结果

      异步效率高于同步

      发起异步任务的方式就是线程和进程

      同步和阻塞时完全不同的:
        阻塞一定是CPU已经切走了

        同步虽然会卡住,但是CPU没有切走还在你的进程中

  • 相关阅读:
    Java基础03 基本程序设计结构
    Java基础02 开发环境搭建
    Java基础01 Java简介
    手动获取Spring上下文和Bean对象
    SAX解析XML
    Hbuilderx换行问题(属性合并一行展示)
    hbuilderx快捷键、回到上一步、回到上次编辑处
    查看jQuery版本号
    【基础篇】js对本地文件增删改查
    【基础篇】js对本地文件增删改查--查
  • 原文地址:https://www.cnblogs.com/LinChengcheng/p/10496394.html
Copyright © 2020-2023  润新知