在python中为我们提供了两个多线程模块,thread模块和threading模块。thread模块是比较底层的模块,threading模块是对thread模块的封装,可以更加方便我们使用,所以这里将用到threading模块。
threading模块常用方法和属性
threading.Thread() - 创建一个线程
参数1为线程执行函数
参数2为元组,用于给函数传递参数
threading.start() - 开启线程
threading.join() - 线程阻塞,主线程将等待子线程结束
想要在多线程中共享全局变量,实现线程同步,可以用到python为我们提供的两种方法
互斥锁
互斥锁是python提供的简单实现线程同步的机制,原理就是当一个线程想要使用共享数据时,先将共享数据进行锁定,其他线程不能使用,直到该线程释放资源,其他线程才可再次锁定共享数据。
互斥锁保证了每次只有一个线程使用共享数据,保证了在多线程下共享数据不会发生混乱。
队列
互斥锁只是简单实现同步的机制,不当的使用互斥锁会造成死锁,所以python为我们提供了更方便的机制,那就是使用队列来共享数据,队列是线程安全的
Queue模块是python提供给我们使用队列的模块
爬虫实战
网站地址:https://www.doutula.com/photo/list/?page=
使用python2编写,用到request库负责发送请求,bs4负责解析网页提取数据,urllib.urlretrieve()方法下载图片
因为代码中注释很详细,这里我就不继续讲解了,具体看代码,下面是我基于互斥锁和队列的两个版本代码
互斥锁版:
队列版:
领取专属 10元无门槛券
私享最新 技术干货