单线程+异步协程实现异步爬虫

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

  • coroutine:协程对象,我们可以将协程对象注册到事件循环中,它会被事件循环调用。
    -- 我们可以使用async关键字来定义一个方法,这个方法在调用时不会立即被执行,而是返回一个协程对象

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

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

async:定义一个协程

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

import asyncio

async def talk(url):
      print('start', url)
      print('end', url)
      return url

t = talk('https://www.baidu.com')

#创建一个事件循环对象
loop = asyncio.get_event_loop()

# 将协程注册到loop中,然后start loop
loop.run_until_complete(t)

下面的代码使用同样的talk

#task的使用,将协程对象进一步封装
loop = asyncio.get_event_loop()

# task是一个任务对象
task = loop.create_task(t)
print(task)

# 注册task到循环对象中
loop.run_until_complete(task)

print(task)
# futrue的使用,futrue类似于task,只不过创建方式不同

loop = asyncio.get_event_loop()
task = asyncio.ensure_future(t)
print(task)
loop.run_until_complete(task)
print(task)
def callback(task):
    # result返回的就是任务对象中封装的协程对象对应函数的返回值
    print(task.result())
    
# 绑定回调
loop = asyncio.get_event_loop()
task = asyncio.ensure_future(t)
task.add_done_callback(callback)
loop.run_until_complete(task)
posted @ 2020-06-25 22:15  bibicode  阅读(162)  评论(0)    收藏  举报