当前位置:   article > 正文

asyncio模块

asyncio模块

asyncio模块

1.概念

asyncio模块,可以帮我们检测阻塞,实现应用程序级别的切换。

1.1特殊函数

在函数定义前添加一个async关键字,该函数就变成了特殊函数。

1.1.1为什么特殊?

a.特殊函数被调用之后,函数内部的程序语句不会被立即执行

b.特殊函数被调用后,会返回一个协程对象

async def get_request(url):
    print('正在请求的网址是:',url)
    await asyncio.sleep(2)
    print('网址请求结束')
    return 123
  • 1
  • 2
  • 3
  • 4
  • 5

1.2协程

协程=特殊函数=函数=一组指定形式的操作

协程的本质就是一组指定形式的操作(一个任务)。

def myAdd(a,b):
    c=a+b
    return c
  • 1
  • 2
  • 3

1.3任务对象

任务对象本质是一个高级的协程

任务对象=高级协程=协程=一组指定形式的操作

1.3.1为什么任务对象是高级的协程?

a.可以给任务对象绑定一个回调函数

回调函数:回调调用的函数,该函数一定是在任务对象被执行完毕后再回调/调用。

asyncio.ensure_future()
  • 1

1.4事件循环loop

当做是一种容器。该容器是用来装载多个任务对象。

loop就可以将其内部装载的任务对象进行异步的执行。

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

# 将一个任务对象装载在了loop中,并且启动loop
loop.run_until_complete(task)
  • 1
  • 2
  • 3
  • 4
  • 5

代码理解

import asyncio
import  time

# 1.特殊函数
async def get_request(url):
    print('正在请求的网址是:',url)
    time.sleep(2)
    print('结束')
    return 123

# 2.特殊函数的调用:返回/创建一个协程对象
c =get_request('www.1.com')
print(c)

# 3.创建任务对象:高级协程
task = asyncio.ensure_future(c)

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

# 将一个任务对象装载在了loop中,并且启动loop
loop.run_until_complete(task)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

结果:
在这里插入图片描述

2.回调函数

2.1重点

  • 使用任务对象回调函数来获取特殊函数的内部返回值
  • 对任务对象绑定一个回调函数(该函数一定是在任务对象被执行完毕后再回调/调用
  • 创建回调函数必须有且仅有一个参数!

2.2实战演示

import asyncio
import  time
'''
回调函数
任务对象给自己绑定回调函数
'''
# 1.创建一个任务对象
async def get_request(url):
    print('正在请求的网址是:',url)
    time.sleep(2)
    print('结束')
    return 123

# 2.调用任务对象:返回协程
# 2.1 使用任务对象使用回调函数来获取特殊函数的内部返回值
c = get_request('www.1.com')
# 2.2 对任务对象绑定一个回调函数(该函数一定是在任务对象被执行完毕后再回调/调用)
task = asyncio.ensure_future(c)

# 3.创建回调函数(必须有且仅有一个参数!)
def task_callback(t):
    # 函数的参数t就是回调函数的调用这task任务对象本身
    # 任务对象调用result()就可以放回特殊函数的内部值
    ret = t.result()
    print('我是回调函数,我被执行了,t.result()返回的结果是:',ret)

# 3.1 给task任务对象绑定一个回调函数task_callback
task.add_done_callback(task_callback)

# 4.创建一个loop
loop = asyncio.get_event_loop()
# 4.1启动loop
loop.run_until_complete(task)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

结果:
在这里插入图片描述

小结:

由上面的两个结果显示可知,没有使用回调函数时,特殊函数不会立即执行内部程序,而直接请求结束;当使用了回调函数时,任务对象被调用后再回调执行函数内部程序返回123

3.异步实现

3.1重点

体会一下当特殊函数内部出现不支持异步模块的代码,会中断整个异步效果

3.2实战演示

3.2.1不支持异步模块

time.sleep(2) #不支持异步效果

import asyncio
import  time

start = time.time()
# 1.创建一个任务对象
'''
注意:特殊函数内部不可以出现不支持异步模块的代码,否则会中断整个异步效果
'''
async def get_request(url):
    print('正在请求的网址是:',url)
    time.sleep(2) #不支持异步效果
   # asyncio.sleep(2)
    print('网址请求结束')
    return 123

urls = ['www.1.com','www.2.com','www.3.com']

# 定义一个任务列表
tasks = []

for url in urls:
    # 创建3个协程
    c = get_request(url)
    # 创建3个任务对象
    task = asyncio.ensure_future(c)
    # 存放3个任务对象到任务列表中
    tasks.append(task)

# 创建一个容器来存放任务列表
loop = asyncio.get_event_loop()
'''
asyncio.wait()函数:用于接收一个任务列表,可以给每一个任务对象赋予被挂起的权限
一个任务被挂起,就表示当前任务对象交出了cpu的使用权,cpu就可以执行其他任务
[task1,task2,task3]
'''
loop.run_until_complete(asyncio.wait(tasks))

print('耗时:',time.time()-start)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

结果:
在这里插入图片描述

3.2.2支持异步模块

await asyncio.sleep(2) # 支持异步效果

import asyncio
import  time

start = time.time()
# 1.创建一个任务对象
'''
注意:特殊函数内部不可以出现不知异步模块的代码,否则会中断整个异步效果
     time.sleep(2) #不支持异步效果
     
     没有加await之前:每一个任务中的阻塞操作并没有被执行
     await关键字:必须要加在每一个任务的阻塞操作前,强调执行阻塞操作
     await用来手动控制任务的挂起操作
'''
async def get_request(url):
    print('正在请求的网址是:',url)
   # time.sleep(2) #不支持异步效果
    await asyncio.sleep(2)
    print('网址请求结束')
    return 123

urls = ['www.1.com','www.2.com','www.3.com']

# 定义一个任务列表
tasks = []

for url in urls:
    # 创建3个协程
    c = get_request(url)
    # 创建3个任务对象
    task = asyncio.ensure_future(c)
    # 存放3个任务对象到任务列表中
    tasks.append(task)

# 创建一个容器来存放任务列表
loop = asyncio.get_event_loop()
'''
asyncio.wait()函数:用于接收一个任务列表,可以给每一个任务对象赋予被挂起的权限
一个任务被挂起,就表示当前任务对象交出了cpu的使用权,cpu就可以执行其他任务
[task1,task2,task3]
'''
loop.run_until_complete(asyncio.wait(tasks))

print('耗时:',time.time()-start)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

结果:
在这里插入图片描述

小结:

当特殊函数中出现不支持异步的函数,就不能实现异步效果

4.多任务的异步协程

发起请求是阻塞,获取响应是阻塞

4.1需求

爬取自己服务器的页面数据,并将其进行数据解析操作

4.2 aiohttp模块

4.2.1 概念

aiohttp模块是一个基于网络请求的模块,功能和requests模块相似,但是requests不支持异步,而aiohttp支持异步。

4.2.2 环境安装

pip install aiohttp
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/832751
推荐阅读
相关标签
  

闽ICP备14008679号