单线程+异步协程实现异步爬虫
-
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)

浙公网安备 33010602011771号