怎么用python3爬虫中的GIL修改多线程

小编给大家分享一下怎么用python3爬虫中的GIL修改多线程,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!

伊州网站制作公司哪家好,找创新互联公司!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设公司等网站项目制作,到程序开发,运营维护。创新互联公司于2013年成立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联公司

我们都知道,比方我有一个4核的CPU,那么这样一来,在单位时间内每个核只能跑一个线程,然后时间片轮转切换。但是Python不一样,它不管你有几个核,单位时间多个核只能跑一个线程,然后时间片轮转。看起来很不可思议?但是这就是GIL搞的鬼。任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在Python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到1个核。通常我们用的解释器是官方实现的CPython,要真正利用多核,除非重写一个不带GIL的解释器。我们不妨做个试验:

#coding=utf-8
from multiprocessing import Pool
from threading import Thread
 
from multiprocessing import Process
 
 
def loop():
    while True:
        pass
 
if __name__ == '__main__':
 
    for i in range(3):
        t = Thread(target=loop)
        t.start()
 
    while True:
        pass

我的电脑是4核,所以我开了4个线程,看一下CPU资源占有率:

怎么用python3爬虫中的GIL修改多线程 

 

我们发现CPU利用率并没有占满,大致相当于单核水平。

而如果我们变成进程呢?

我们改一下代码:

#coding=utf-8
from multiprocessing import Pool
from threading import Thread
 
from multiprocessing import Process
 
 
def loop():
    while True:
        pass
 
if __name__ == '__main__':
 
    for i in range(3):
        t = Process(target=loop)
        t.start()
 
    while True:
        Pass

怎么用python3爬虫中的GIL修改多线程

结果直接飙到了100%,说明进程是可以利用多核的!

如果小伙伴们运行的结果也是cpu百分之百,就说明本次的修改成功了。为了更直观的让大家看出前后区别,小编特意准备了前后的对比,说明GIL修改多线程的方法是可行的!

看完了这篇文章,相信你对怎么用python3爬虫中的GIL修改多线程有了一定的了解,想了解更多相关知识,欢迎关注创新互联行业资讯频道,感谢各位的阅读!


本文名称:怎么用python3爬虫中的GIL修改多线程
标题网址:http://scyanting.com/article/ppgjpj.html