asyncio(模拟针对异步io数据的抓取)

import asyncio

'''
针对url相同而请求所携带的参数不同编写的一个异步io解决案例
'''
async def get_request(data):#被async修饰的函数就是一个协程对象
    '''
    模拟异步请求(多任务当中出现同步代码就不能使用异步操作)
    :param data:
    :return:
    '''
    await asyncio.sleep(2) #基于异步模块模拟异步任务
    #await 关键字手动挂起异步阻塞
    url = 'www.xiecheng.com'
    print(url,data) #模拟请求携带不同参数
def callback(task):
    pass

datelist = [
    '2020-01-10',
    '2020-01-11',
    '2020-01-12',
    '2020-01-13',
    '2020-01-14',
]
listcity = {
    '北京':'郑州',
    '上海':'大连',
    '深圳':'江苏',
    '广州':'哈尔滨',
    '杭州':"沈阳",
    '南京':'新疆',
}

task_list=[] #定义任务列表用来存放任务
for date in datelist: #
    for city in listcity: # 循环创建任务
        data = {
            'start':city,
            'arr':listcity.get(city),
            'date':date,
        }
        r = get_request(data)
        task = asyncio.ensure_future(r)#创建任务对象
        task_list.append(task) #将任务对象添加到任务列表中

loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(task_list)) #将任务列表封装到wait对象中

'''
笔记

  event_loop(事件循环):相当于一个无限循环,我们可以把一些函数注册到这个事件循环上,当满座某些条件的时候,函数就会被循环执行
  coroutine(协程对象):我们可以将协程对象注册到时间循环中,它会被事件循环调用。我们可以使用async关键字来定义一个方法
                                      ,这个方法在调用的时候不会被立即执行,而是返回一个协程对象。

   task(任务):他是写成对象的进一步封装,包含任务的哥哥状态。
   future:代表将来执行或者还没有执行的任务,实际上和task没有什么区别
   async:定义一个协程
   await:用来挂起阻塞方法的执行


'''

aiohttp https://www.cnblogs.com/lcy-123/p/14086950.html
posted @ 2020-12-04 16:58  心无垠  阅读(118)  评论(0)    收藏  举报