首页 > 编程 > Python > 正文

python爬虫之线程池和进程池功能与用法详解

2020-02-15 22:38:32
字体:
来源:转载
供稿:网友

本文实例讲述了python爬虫之线程池和进程池功能与用法。分享给大家供大家参考,具体如下:

一、需求

最近准备爬取某电商网站的数据,先不考虑代理、分布式,先说效率问题(当然你要是请求的太快就会被封掉,亲测,400个请求过去,服务器直接拒绝连接,心碎),步入正题。一般情况下小白的我们第一个想到的是for循环,这个可是单线程啊。那我们考虑for循环直接开他个5个线程,问题来了,如果有一个url请求还没有回来,后面的就干等,这么用多线程等于没用,到处贴创可贴。

二、性能考虑

确定要用多线程或者多进程了,那我们到底是用多线程还是多进程,有些人对多进程和多线程有一定的偏见,就因为python的GIL锁,下面我们说一下这两个东西的差别。

三、多线程:

一般情况下我们启动一个.py文件,就等于启动了一个进程,一个进程里面默认有一个线程工作,我们使用的多线程的意思就是在一个进程里面启用多个线程。但问题来了,为什么要使用多线程呢?我知道启动一个进程的时候需要创建一些内存空间,就相当于一间房子,我们要在这个房子里面干活,你可以想一个人就等于一个线程,你房子里面有10个人的空间跟有20个人的空间,正常情况下是不一样的,因为我们知道线程和线程之间默认是可以通信的(进程之间默认是不可以通信的,不过可以用技术实现,比如说管道)。可以多线程为了保证计算数据的正确性,所以出现了GIL锁,保证同一时间只能有一个线程在计算。GIL锁你可以基本理解为,比如在这个房间里要算一笔账,在同一时间内只能有一个人在算这笔账,想一个问题,如果这笔账5个人就能算清楚,我需要10平米的房间就行,那为什么要请10个人,花20平米呢?所以并不是开的线程越多越好。但是,但是,但是,注意大家不用动脑筋(CPU计算)算这笔账的时候可以去干别的事(比如说5个人分工,各算一部分),比如说各自把自己算完后的结果记录在账本上以便后面对账,这个的话每个人都有自己的账本,所以多线程适合IO操作,记住了就算是适合IO操作,也不代表说人越多越好,所以这个量还是得根据实际情况而定。

线程池示例:

import requestsfrom concurrent.futures import ThreadPoolExecutorurls_list = [  'https://www.baidu.com',  'http://www.gaosiedu.com',  'https://www.jd.com',  'https://www.taobao.com',  'https://news.baidu.com',]pool = ThreadPoolExecutor(3)def request(url):  response = requests.get(url)  return responsedef read_data(future,*args,**kwargs):  response = future.result()  response.encoding = 'utf-8'  print(response.status_code,response.url)def main():  for url in urls_list:    done = pool.submit(request,url)    done.add_done_callback(read_data)if __name__ == '__main__':  main()  pool.shutdown(wait=True)            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表