15-多线程爬虫-多线程的GIL锁

多线程的GIL锁

python自带的解释器是CPython。

CPython解释器的多线程实际上是一个假的多线程(在多核CPU中,只能利用一核,不能利用多核)。即同一时刻只有一个线程在执行,为了保证同一时刻只有一个线程在执行,在CPython解释器中有一个东西叫做GIL(Global Intepreter Lock),叫做全局解释器锁。

这个解释器锁是有必要的,因为CPython解释器的内存管理不是线程安全的,需要注意的是,除了CPython解释器,还有其他的解释器,有些解释器是没有GIL锁的

1>Jython:用Java实现的Python解释器,不存在GIL锁

2>IronPython:用.net实现的Python解释器,不存在GIL锁

3>PyPy:用python实现的Python解释器,存在GIL锁

 

总结

GIL虽然是一个假的多线程,但是在处理一些IO操作(比如文件读写和网络请求),还是可以在很大程度上提高效率的。在IO操作上建议使用多线程提高效率。在一些CPU计算操作上不建议使用多线程,而建议使用多进程

 

GIL和Lock的关系:
为什么有了GIL,还需要有Lock锁?
GIL只是保证全局同一时刻只有一个线程在执行,但是他并不能保证执行代码的原子性。也就是说一个操作可能会被分成几个部分完成,这样就会导致数据出现时问题。(比如A=1,同时有两个线程对A进行自增操作,最终得到t1为A=2,t2为A=2,应当是两次操作A=3)
因此,我们需要使用Lock锁来保证数据的完整性。

 

posted @ 2021-04-26 20:50  马铃薯1  阅读(70)  评论(0编辑  收藏  举报