小爬爬4.协程基本用法

1.测试学习

(2)单线程:

from time import sleep
import time
def request(url):
    print('正在请求:',url)
    sleep(2)
    print('下载成功:', url)
urls = ['www.baidu.com','www.sogou.com','www.goubanjia.com']
start = time.time()
for url in urls:
    request(url)
print(time.time()-start)

测试结果:需要6秒多

正在请求: www.baidu.com
下载成功: www.baidu.com
正在请求: www.sogou.com
下载成功: www.sogou.com
正在请求: www.goubanjia.com
下载成功: www.goubanjia.com
6.001747369766235

(2)开启线程池:测试结果是2秒多

from time import sleep
import time
from multiprocessing.dummy import Pool
def request(url):
    print('正在请求:',url)
    sleep(2)
    print('下载成功:', url)
urls = ['www.baidu.com','www.sogou.com','www.goubanjia.com']
start = time.time()
pool=Pool(3)
pool.map(request,urls)
print(time.time()-start)

测试结果:

正在请求: www.baidu.com
正在请求: www.sogou.com
正在请求: www.goubanjia.com
下载成功: www.goubanjia.com
下载成功: www.sogou.com
下载成功: www.baidu.com
2.034695625305176

(3)在程序中是否可以一味的使用多线程,多进程?

推荐:单线程+异步协程(效率最高,用的人不是很多,大量爬取数据是会用到的)

下面了解一下

协程(go和python独有的概念),,协程不会占用很高的内存

领导在乎的是把数据爬取出来.

主要还是request模块的学习.下面学习几个概念这几个概念,一会儿会在代码中有所体现

event_loop:事件循环,相当于一个无限循环,我们可以把一些特殊函数注册(放置)到这个事件循环上,当满足某些条件的时候,函数就会被循环执行。程序是按照设定的顺序从头执行到尾,
运行的次数也是完全按照设定。当在编写异步程序时,必然其中有部分程序的运行耗时是比较久的,需要先让出当前程序的控制权,让其在背后运行,让另一部分的程序先运行起来。当背后运行的程序完成后,
也需要及时通知主程序已经完成任务可以进行下一步操作,但这个过程所需的时间是不确定的,需要主程序不断的监听状态,一旦收到了任务完成的消息,就开始进行下一步。loop就是这个持续不断的监视器。 coroutine:中文翻译叫协程,在 Python 中常指代为协程对象类型,我们可以将协程对象注册到事件循环中, 它会被事件循环调用。我们可以使用
async 关键字来定义一个方法,这个方法在调用时不会立即被执行, 而是返回一个协程对象。 task:任务,它是对协程对象的进一步封装,包含了任务的各个状态。 future:代表将来执行或还没有执行的任务,实际上和 task 没有本质区别。 另外我们还需要了解 async/await 关键字,它是从 Python 3.6 才出现的,专门用于定义协程。其中,async 定义一个协程,await 用来挂起阻塞方法的执行。

猜你喜欢

转载自www.cnblogs.com/studybrother/p/10951229.html
今日推荐