(现在人工智能非常火爆,很多朋友都想学,但是一般的教程都是为博硕生准备的,太难看懂了。最近发现了一个非常适合小白入门的教程,不仅通俗易懂而且还很风趣幽默。所以忍不住分享一下给大家。
点这里https://www.cbedai.net/ialexanderi可以跳转到教程。)
链接:https://zhuanlan.zhihu.com/p/35179605
前言
关于网络IO,同步,异步或者阻塞非阻塞永远是绕不开的话题。对于爬虫这种IO密集型任务,如果使用同步的方式进行网络请求,只要某个请求被阻塞了,则会造成整个流程时间的拖长,极大的降低了爬虫的速度。这篇文章将介绍Python实现异步的其中一种方式,协程。并通过一些实例来说明协程的用法,以及好处。
基本知识
- 同步,异步
上文提到了同步与异步两个术语,那么这两者到底有什么区别呢?拿爬虫场景举个例子,比如说现在爬虫需要点开十个链接,IO过程就是打开这十个链接的过程,CPU负责点击链接的事件。显而易见,点击事件是非常快速的,而链接显示的过程是比较缓慢的。同步IO就是爬虫点击了一个网址,等到获得了彻底响应,才去点击下一个网址。而异步IO就是爬虫点击了一个网址,不等获得响应,立刻点击下一个网址,最后等待响应。两者对比,异步的效率会更加高一些。
- IO密集与计算密集
IO密集型任务指的是磁盘IO或者网络IO占主要的任务,计算量很小,比如请求网页,读写文件等。计算密集型任务指的是CPU计算占主要的任务,比如图形渲染中矩阵的运算(当然现在都用GPU来完成)。
- 为什么不使用多线程
一般来说,解决并行事件的传统思路可能是使用多线程。 但是多线程有几个劣势,第一是资源的开销,第二是由于Python GIL(全局解释锁)的存在,多线程并非并行执行,而是交替执行,造成多线程在计算密集型任务的效率并不高。
- 协程是什么
协程的概念比较容易理解,它在单线程中,允许一个执行过程A中断,然后转到执行过程B,在合适的时间又可以转回来,从而在单线程中实现了类似多线程的效果。而它有以下几点优势:
-
- 数量理论上可以是无限个,因为是在单线程上进行,没有线程间的切换操作,效率比较高。
- 不需要“锁”的机制,所有的协程都在一个线程中。
- 比较容易Debug,因为代码是顺序执行。