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

初学多线程爬虫


【0】如何认识多线程

计算机完成一项或多项任务,往往可以存在很高的并行度:若是多核处理器则天然的可以同时处理多项事务,若是单处理器时其实也可以分时隙处理多任务,此时虽然在某一时间点上确实是不能一脑多用,但却可以省掉很多处理器之外的等待时间,实现某种意义上的并行,或者叫多线程,进而带来效率上的提高。实际上,若不支持多线程,那么我们的电脑似乎就只能同时干一件事了,那该有多low啊。

当爬虫遇上了多线程,那么就可以实现并行爬虫,本来一只虫子在爬取数据,现在变成了多只虫子同时爬,效率自然要高出许多。所以,threading库应运而生。

Ps:关于进程和线程的区别,简单讲:进程层次更高一点,更接近任务级别,而线程层次要相对低一点,更接近处理器端真实处理过程。包含关系:一个任务可包含多进程,一个进程可包含多线程。


【1】如何实现多线程python爬虫

以下只是一个简单总结。

1.建立线程

代码语言:javascript
复制
#1.创建函数,引入线程
deffun():
    pass
thread-1= threading.Thread(target=fun,args=[],name='thread-1')

#2.直接继承线程类
classmythread(threading.Thread):
    def __init__(self):
        Thread.__init__(self):
        #加这一步后主程序中断退出后子线程也会跟着中断退出
        self.daemon = True
    def run(self):
        #线程运行的函数
        pass
thread-1= mythread()

2.开启线程

代码语言:javascript
复制
thread_1.start()   #开始线程
thread_1.join()    #阻塞直至该线程运行完毕

3.线程内实现功能

  • 若是采用构建函数引入线程,则直接在函数fun()内完成特定功能即可
  • 若是采用继承线程类,则可在类中的run()方法完成特定功能

4.线程间同步

因为线程间存在竞争和冲突,所以需要线程间同步。考虑队列(queue)已内置了同步功能,所以在多线程分配任务时往往配合一个queue来实现,所以有人说实现多线程爬虫重点就是队列,队列用明白了多线程就自然理解了。


【2】效率对比

来个简单的效率对比。给定100个左右网页链接,完成从这些网页中下载文本并保存至本地txt文件中。显然,这是一个典型的可以并行操作的任务。完成该任务的效率对比如下:

  • 线程数1:耗时45.9s
  • 线程数2:耗时25.2s
  • 线程数4:耗时13.5s
  • 线程数8:耗时8.2s

可见,多线程情况下效率提升还是非常明显的。当然,肯定不会是线程数越多越好。

下一篇
举报
领券