美文网首页
Python48_GIL的问题

Python48_GIL的问题

作者: jxvl假装 | 来源:发表于2019-09-28 10:57 被阅读0次

GIL:全局解释器锁
作用:保证了多个线程时,在同一时刻只有一个线程会被调用(不管电脑是几核的)(也就是说python中的线程其实是假的,这就造成在python中多进程的效率远远高于多线程,特别是多核的时候)

因此,在python中,能用进程的时候尽量用进程,而不使用线程

如果非要用线程呢?如何解决?
关键的地方用C语言来写

用死循环进行示例,通过查看各个核的占用情况(Linux中可以用htop)查看是否实现了真正的多线程

用C语言在loop.c文件中写一个死循环

void DeadLoop()
{
    while(1)
    {
    ;
    }
}

并将之做成一个库
(Linux环境中)
gcc loop.c -shared -o libdeadloop.so
就会生成一个libdeadloop.so的文件(动态库)

在python文件中

from ctypes import *
from threading import Thread

#加载动态库
lib = cdl.LoadLibrary("./libdeadloop.so")   #假设做制作的动态库就在当前目录下
#cdl是ctypes里面的

#创建一个子线程,让其执行C语言编写不函数,此函数是一个死循环
t = Thread(target=lib.DeadLoop) #DeadLoop是动态库里面的函数(即上面用C语言编写的函数的函数名)
t.start()

while True:
    pass
#会发现两个核的占用很快就达到很高的占用

面试题

描述Ptyhon GIL的概念,以及它对python多线程的影响?多线程爬取程序是否可以比单线程快?并解释原因

参考答案:

  1. GIL并不是Python语言的问题,仅仅是由于历史原因在Cpython解释器(Python官网推荐)中难以移除GIL(比如java语言写的jpython就没有这个问题)。
  2. GIL:全局解释器锁。每个线程在执行的过程都需要先获取GIL,保证同一时刻只有一个线程可以执行代码
  3. 线程释放GIL锁的情况:在IO操作等可能会引起阻塞的system call之前,可以暂时释放GIL,但在执行完毕后,必须重新获取GIL。Python 3.x使用计时器(执行时间大到阀值后,当前线程释放GIL)或Python 2.x,tickets达到100
  4. Python使用多进程是可以利用多核的CPU资源的
  5. 多线程爬取比单线程性能有提升,因为遇到IO阻塞会自动释放GIL锁

如何避免GIL的问题?

  1. 避免使用Cpython解释器
  2. 用其他语言替代线程中要做的事情

GIL主要是对于计算密集型不利,对于IO密集型,用多线程(或协程)仍然能够提升性能

相关文章

  • Python48_GIL的问题

    GIL:全局解释器锁作用:保证了多个线程时,在同一时刻只有一个线程会被调用(不管电脑是几核的)(也就是说pytho...

  • 问题的问题

    “你别总给我说问题、问题,给我提一些建设性的建议行不?” “你咋变成了意见篓子?” 满腔热血地跑到领导面前表功,结...

  • 问题的问题

    “你别总给我说问题、问题,给我提些建设性的建议行不?” “你咋变成了意见篓子?” 满腔热血地跑到领导面前表功,结果...

  • 问题的问题

    问题家庭的问题是:家长本身用着有问题的方法教育孩子,没问题的孩子也变得有问题。 而且更严重的问题是:家长并没有意识...

  • 问题 的问题

    人大部分时间是在矛盾中挣扎着,有时候是心里想的是这样,但是不得不面对现实和道德,而选择了与内心不相符的决定...

  • 问题的问题

    现实问题,很多生活中,男人考虑问题往往没有女人周全,细致,男人只看生活的表面,然而女人,看的是生活的全面问题,就像...

  • 问题的问题

    人生中我们会有很多问题。每天都在处理各种各样的问题,处理完又产生。当我们回到自己问题的解决了,产生问题的时间也会越...

  • 问题的问题

    1 老孙是个特别认真又勤快的人。不管什么时候、什么事情,只要交到他手上,他都能非常投入的去做好,做到极致。 在老孙...

  • 问题的问题

    很多时候,或者说在很长一段时间里,世界在我眼里都是问题。我固执地认为,如果想要让生活过得充实,就必须解决现...

  • 问题的问题

    下面先讲个故事。说,在一个国际夏令营里,老师让来自世界各地的孩子讨论一个问题,题目是“世界粮食匮乏问题”。...

网友评论

      本文标题:Python48_GIL的问题

      本文链接:https://www.haomeiwen.com/subject/rghuuctx.html