zoukankan      html  css  js  c++  java
  • GIL全局解释器锁及解决办法

    进程占用资源查看:htop

    双核CPU:同一时刻可以做两件事情 可以同时并行2个进程

     

     

    单线程死循环,占满了CPU

     

    多线程死循环

    运行多线程死循环后的CPU占用率【实际总共只占用了一个CPU的资源,和单线程的占用的资源是一样的】

    多进程死循环

    运行多进程死循环后CPU的占用率

    小结:

    以上可以看出 多进程 多线程协程 只有多进程能真正实现并发【占满了两个CPU】

    而不管是多线程还是单线程,最后占用的总的CPU资源是一样的

    当然了 因为进程才是资源的分配单位

    为什么python中多线程和单线程占用的CPU是一样的

    因为有一个全局解释器锁:它保证了多线程的程序,一个时刻只有一个线程在工作,而其他线程在休息

     全局解释器锁

    小结:

    所以如果用的CPython解释器,那么只有通过多进程实现多任务

    如果用的JPython解释器,可以使用多线程实现多任务

    执行多线程可以发挥多核CPU的能力,让多个CPU同时工作

    即使存在全局解释器锁,如果是进行网络爬虫等I/O密集型工作,依然比单线程效率高

     Cpython解释器下:

    计算密集型工作使用多进程完成

    I/O密集型使用多线程完成

    关于C语言

    C语言:xxx.c

    C语言编译后的代码:xxx.out

    C语言是编译型语言:先编译成二进制数据 然后CPU可以直接执行这个二进制程序

    python是解释型语言

    python语言调用C语言的方式:

    .so就是编译过后的文件【动态库,即二进制文件】,在python中去调用这个.so中的函数即可

     

    执行调用了C语言后的CPU占用率

    总结:全局解释器锁的解决办法

    所以 对于GIL的两种解决办法:

    1.换python解释器 不使用Cpython

    2.把子线程中的代码换成其他语言来实现

     

    python可以调很多其他语言:C C++ Java JS等等

    C语言只能调用C语言

    java可以调用python

  • 相关阅读:
    C# 泛型
    css样式优先级
    c# 可空类型
    JS 两个数组合并
    c# 参数传递问题(形参与实参)
    c# JsonReader读取json字符串
    C# 获取当前ip
    swprintf引发的血案
    Struts2解析FreeMarker模板中变量的顺序
    structs2在action中输出
  • 原文地址:https://www.cnblogs.com/come202011/p/12978364.html
Copyright © 2011-2022 走看看