Python多线程,thread标准库。都说Python的多线程是鸡肋,推荐使用多进程。
Python为了安全考虑有一个GIL。每个CPU在同一时间只能执行一个线程
GIL的全称是Global Interpreter Lock(全局解释器锁),就相当于通行证,每一次线程会先要去申请通行证,通行证申请下来了,才能进入CPU执行。
每个线程的执行方式:
1、获取GIL
2、执行代码直到sleep或者是python虚拟机将其挂起。
3、释放GIL
每次释放GIL锁,线程进行锁竞争、切换线程,会消耗资源。并且由于GIL锁存在,python里一个进程永远只能同时执行一个线程(拿到GIL的线程才能执行),这就是为什么在多核CPU上,python的多线程效率并不高。
下面使用多线程加队列做的一个demo。爬取的是笔趣阁的小说,只是做了一个打印,没有做具体的保存。爬取用的selenium。Chrome的无头模式。有点慢,可以直接用库,或者跑整站的话用scrapy.
使用Threading模块创建线程,直接从threading.Thread继承,然后重写init方法和run方法:
线程同步
如果多个线程共同对某个数据修改,则可能出现不可预料的结果,为了保证数据的正确性,需要对多个线程进行同步。
使用Thread对象的Lock和Rlock可以实现简单的线程同步,