首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python爬虫之多进程爬取

在python爬虫中,一般用的是多进程进行爬取,因为多线程并不能提高CPU的使用率,而且多线程其实是交替执行,多进程才是并发执行。

多进程,顾名思义,多个进程并发执行,可以有效提高程序的执行效率,优点是非常稳定,即使有子进程崩溃了,主进程和其他进程依然可以继续执行,缺点是在windows下创建进程的开销比较大,而且如果进程太多,往往会影响整个系统的调度。

多线程是指一个进程内多个线程同时执行,进而提高程序执行效率,其优点可能是比多进程稍微快一点,但缺点也很明显,多线程中一个线程出现了问题就会导致整个进程崩溃,因此稳定性不是很高。

因 为GIL(全局解释器锁)的限制(GIL是用来保证在任意时刻只能有一个控制线程在执行),所以python中的多线程并非真正的多线程。只有 python程序是I/O密集型应用时,多线程才会对运行效率有显著提高(因在等待I/O的时,会释放GIL允许其他线程继续执行),而在计算密集型应用 中,多线程并没有什么用处。考虑到要充分利用多核CPU的资源,允许python可以并行处理一些任务,这里就用到了python多进程编程了。

先上一个多进程和单进程测试的结果:

我们可以发现,多进程执行比单进程速度快了一百多倍,所以说,并行大法好啊

我这里用的是Pool池的方法来使用多进程的

当使用Process类管理非常多(几十上百个)的进程时,就会显得比较繁琐,这是就可以使用Pool(进程池)来对进程进行统一管理。当池中进程已满时,有新进程请求执行时,就会被阻塞,直到池中有进程执行结束,新的进程请求才会被放入池中并执行。

用法:

apply(self, func, args=(), kwds={}):

阻塞型进程池,会阻塞主进程,直到工作进程全部退出,一般不用这个

apply_async(func[, args=()[, kwds={}[, callback=None]]])

与apply用法一样,但它是非阻塞且支持结果返回进行回调。

map(func, iterable[, chunksize=None])

Pool类中的map方法,与内置的map函数用法行为基本一致,它会使进程阻塞直到返回结果。

注意,虽然第二个参数是一个迭代器,但在实际使用中,必须在整个队列都就绪后,程序才会运行子进程。

close()

关闭进程池(pool),使其不在接受新的任务。

terminate()

结束工作进程,不在处理未处理的任务。

join()

主进程阻塞等待子进程的退出,join方法必须在close或terminate之后使用。

用法示例:

运行结果:

我个人在爬虫中的用法:

个人经验分享,不足之处请指正。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180224A0IMSR00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券