zoukankan      html  css  js  c++  java
  • GIL 线程/进程池 同步异步

    GIL
    什么是GIL
    全局解释器锁,本质是一把互斥锁,是加在cpython解释器上的一把锁,
    同一个进程内的所有线程需要先抢到GIL锁,才能执行python代码

    为什么要有GIL
    cpython解释器的内存管理机制是非线程安全的

    GIL与自定义互斥锁的区别:
    相同:都是互斥锁
    不同:GIL是加在解释器身上,全局的
    自定义作用于局部
    单进程内所有线程都会去抢GIL
    局部线程会去抢自定义互斥锁

    GIL的优缺点:
    优点:保证了cpython解释器内存管理的线程安全
    缺点:同一进程内的所有线程同一时刻内只有一个可以执行,不能并行线程

    线程池,进程池
    池:装固定数目的进程or线程
    为什么要用:让机器在自己可承受的范围内去保证一个高效的工作
    from concurrent.futures import ThreadPoolExecutor ,ProcessPoolExecutor
    pool= ProcessPoolExecutor(4)
    future = pool.submit(task,arg1,arg2...)是一种异步提交任务的方式
    pool.shutdown()指的是不能再往进程池内提交任务,wait = True 等待进程池或线程池内所有的任务都运行完毕
    future.result()获取结果,#异步提交任务,串行的获取结果

    什么时候用多进程,什么时候用多线程:
    单进程下的多个线程是无法并行,无法并行意味着不能利用多核优势
    cpu干的是计算的活,多个cpu意味着提升了计算性能
    cpu是无法做IO操作的,多个CPU在IO操作前毫无用处
    当我们的程序是IO密集型时,多核对性能的提升微不足道,此时可使用多线程
    当我们的程序是计算密集型时,一定要用上多核优势,可以使用多进程

    阻塞与非阻塞:
    阻塞:遇到IO就发生阻塞,程序一旦遇到阻塞操作就会停在原地,并且立即释放CPU资源
    非阻塞(就绪或运行态):没有遇到IO操作,或者通过某种手段让程序即便是遇到IO也不会停在原地

    同步与异步指的是提交任务的两种方式
    同步调用:提交完任务后,就在原地等待,直到任务运行完毕后,拿到任务的返回值,才继续执行下一行代码
    异步调用:提交完任务后,不在原地等待,直接直接下一行的代码

  • 相关阅读:
    centos 7 端口
    linux yum
    linux RPM包管理
    linux 进程
    linux 显示系统执行的进程
    linux 任务调度
    linux 组管理
    linux 压缩和解压缩
    linux 文件目录类的指令 包含查找
    PHP指定字段的多维数组排序方法
  • 原文地址:https://www.cnblogs.com/robert-zhou/p/10219429.html
Copyright © 2011-2022 走看看