python GIL:使用C生成的动态库.so

    并行和并发同属于多任务,目的是要提高CPU的使用效率。这里需要注意的是,一个CPU永远不可能实现并行,即一个CPU不能同时运行多个程序,但是可以在随机分配的时间片内交替执行(并发),就好像一个人不能同时看两本书,但是却能够先看第一本书半分钟,再看第二本书半分钟,这样来回切换。

先看下几种情况下,CPU使用情况:
1、单核CPU、单[进/线]程死循环
执行结果分析:单核的CPU占用率达到100%
python GIL:使用C生成的动态库.so
2、双核CPU、两个进程死循环
执行结果分析:多进程则是会完全调用两个CPU,同时执行;两个CPU的占用率都为100%
python GIL:使用C生成的动态库.so
3、双核CPU、两个线程死循环
执行结果分析:双核的CPU占用率总和为100%,而不是双核都为100%,此处有蹊跷,是因为 cpython在解析多线程时,会上GIL全局排他锁,保证了同一时刻只有一个线程能占用CPU资源,python中的多线程并不是真正意义上的多线程,它的运行效率比python中的多进程低。
python GIL:使用C生成的动态库.so
    那么问题来了,python中的多线程效率较低,不会充分的利用CPU资源,那么应该怎么解决该问题呢?

  1. 更换cpython为jpython( 不建议 )
  2. 使用多进程完成多线程的任务( 进程通信比较麻烦 )
  3. 关键的效率高的代码部分使用C语言写,生成动态库;再使用python调用动态库

使用python调用C语言生成的动态库中的函数
python GIL:使用C生成的动态库.so
此时执行python代码后,执行结果是:两个线程会完全调用两个CPU,同时执行;两个CPU的占用率都为100%,如下图所示:
python GIL:使用C生成的动态库.so