首页 > 编程语言 > 详细

PYTHON_异步爬虫(三)之协程(一)

时间:2021-02-20 16:07:37      阅读:47      评论:0      收藏:0      [点我收藏+]

一、异步协程的基本使用

   -event_loop:事件,相当于一个无线循环,我们可以把一些函数注册到这个事件循环上,当满足某些条件的时候,函数就会被循环执行。

   -coroutine:协程对象,我们可以将协程对象注册到事件循环中,它会被事件循环调用。

    我们可以使用 async 关键字来定义一个方法,这个方法在调用时不会立即被执行,而是返回一个协程对象。

   -task:任务,它是对协程对象的进一步封装,包含了任务的各个状态。

   -future:代表将来执行或还没有执行的任务,实际上和task没有本质区别。

     -async 定义一个协程

     -await 用来挂起阻塞方法的执行。

 

1、创建一个事件循环对象

 

 1 import asyncio
 2 
 3 async def request(url):
 4     print(正在请求的url是,url)
 5     print(请求成功,url)
 6 
 7 #async修饰的函数,调用之后返回一个协程对象
 8 c=request(www.baidu.com)
 9 
10 #创建一个事件循环对象
11 loop=asyncio.get_event_loop()
12 
13 #将协程对象注册到loop中,然后启动loop
14 loop.run_until_complete(c)

 

 

2、task的使用

 1 import asyncio
 2 
 3 async def request(url):
 4     print(正在请求的url是,url)
 5     print(请求成功,url)
 6 
 7 #async修饰的函数,调用之后返回一个协程对象
 8 c=request(www.baidu.com)
 9 
10 #task的使用
11 loop = asyncio.get_event_loop()
12 #基于loop创建一个task对象
13 task=loop.create_task(c)
14 
15 loop.run_until_complete(task)
16  
17 print(task)

 

3、future的使用

 1 import asyncio
 2 
 3 async def request(url):
 4     print(正在请求的url是,url)
 5     print(请求成功,url)
 6 
 7 #async修饰的函数,调用之后返回一个协程对象
 8 c=request(www.baidu.com)
 9 
10 #future的使用
11 loop = asyncio.get_event_loop()
12 task= asyncio.ensure_future(c)
13 print(task)
14 loop.run_until_complete(task)
15 print(task)

 

4、绑定回调

 1 import asyncio
 2 
 3 async def request(url):
 4     print(正在请求的url是,url)
 5     print(请求成功,url)
 6     return url
 7 
 8 #async修饰的函数,调用之后返回一个协程对象
 9 c=request(www.baidu.com)
10 
11 def callback_func(task):
12     #result返回的就是任务对象中封装的协程对象对应函数的返回值
13     print(task.result())
14 
15 #绑定回调
16 loop = asyncio.get_event_loop()
17 task = asyncio.ensure_future(c)
18 #将回调函数绑定到任务对象中
19 task.add_done_callback(callback_func)
20 loop.run_until_complete(task)

二、多任务协程

 1 import asyncio
 2 import time
 3 
 4 async def request(url):
 5     print(正在下载,url)
 6     time.sleep(2)
 7     print(下载完毕,url)
 8 
 9 start=time.time()
10 
11 urls=[
12     www.baidu.com,
13     www.sogou.com,
14     www.goubanjia.com
15 ]
16 
17 #任务列表:存在多个任务对象
18 stacks=[]
19 
20 for url in urls:
21     c=request(url)
22     task=asyncio.ensure_future(c)
23     stacks.append(task)
24 
25 loop = asyncio.get_event_loop()
26 #需要将任务列表封装到wait中
27 loop.run_until_complete(asyncio.wait(stacks))
28 
29 print(time.time()-start)

运行结果:

技术分享图片

 

 发现多任务协程是同步的,这是为什么?

#在异步协程中如果出现了同步模块相关的代码,那么就无法实现异步。
# time.sleep(2)
#当在asyncio中遇到阻塞操作必须进行手动挂起

 1 import asyncio
 2 import time
 3 
 4 async def request(url):
 5     print(正在下载,url)
 6     #在异步协程中如果出现了同步模块相关的代码,那么就无法实现异步。
 7     # time.sleep(2)
 8     #当在asyncio中遇到阻塞操作必须进行手动挂起
 9     await asyncio.sleep(2)
10     print(下载完毕,url)
11 
12 start=time.time()
13 
14 urls=[
15     www.baidu.com,
16     www.sogou.com,
17     www.goubanjia.com
18 ]
19 
20 #任务列表:存在多个任务对象
21 stacks=[]
22 
23 for url in urls:
24     c=request(url)
25     task=asyncio.ensure_future(c)
26     stacks.append(task)
27 
28 loop = asyncio.get_event_loop()
29 #需要将任务列表封装到wait中
30 loop.run_until_complete(asyncio.wait(stacks))
31 
32 print(time.time()-start)

运行结果:

技术分享图片

 

PYTHON_异步爬虫(三)之协程(一)

原文:https://www.cnblogs.com/industrial-fd-2019/p/14420351.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!