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锁来保证数据的完整性。