• 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也不会停在原地

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

  • 相关阅读:
    Oracle报错:ORA-01747: user.table.column, table.column 或列说明无效
    easyUI 比较时间大小
    五个在XML文档中预定义好的实体
    js截取字符串
    luogu2155 [SDOI2008]沙拉公主的困惑
    Codeforces Round #533 (Div. 2)题解
    luogu3327 [SDOI2015]约数个数和
    luogu3911 最小公倍数之和(莫比乌斯反演)
    luogu4449 于神之怒加强版(莫比乌斯反演)
    luogu3704 [SDOI2017]数字表格(莫比乌斯反演)
  • 原文地址:https://www.cnblogs.com/robert-zhou/p/10219429.html
Copyright © 2020-2023  润新知