import asyncio
import requests
async def request():
url = 'https://www.baidu.com'
status = requests.get(url) # 同步阻塞的GET请求
print("This is :",status)
print("Text is :",status.text)
return status
def callback(task):
print('Status:',task.result())
coroutine = request() # 创建协程对象(此时协程未执行)
task = asyncio.ensure_future(coroutine) # 将协程包装为Future/Task对象
task.add_done_callback(callback) # 为任务绑定回调:任务完成后执行callback
print('Task:',task)
loop = asyncio.get_event_loop() # 获取默认的事件循环对象
loop.run_until_complete(task) # 启动事件循环,直到task执行完毕
print('Task:',task)
核心理解:requests.get(url) 是什么?
requests.get() 是 Python requests 库提供的同步阻塞式 HTTP GET 请求方法,作用是向指定的 URL 发送 HTTP GET 请求,等待服务器响应并返回一个 Response 响应对象。
结合你的代码分析 requests.get(url)
1. 代码中的执行逻辑
你在异步协程函数 request() 中调用了这行代码:
async def request():
url = 'https://www.baidu.com'
status = requests.get(url) # 重点分析这行
return status
- 同步特性 :当事件循环驱动协程执行到
requests.get(url)时,整个程序会阻塞在这里 ------CPU 会一直等待网络请求的往返(从发送请求到收到百度服务器的响应),期间无法做任何其他事,直到拿到响应结果后,才会执行return status。 - 返回值 :这行代码的返回值是
requests.models.Response对象(你代码中赋值给了status变量),这个对象包含:- 状态码(
status_code,比如 200 表示成功); - 响应头(
headers); - 响应内容(
text是网页源码,content是二进制内容)等。
- 状态码(
- 你后续通过
task.result()拿到的就是这个Response对象,所以回调函数打印的是<Response [200]>(200 是 HTTP 状态码)。
运行结果:


增加了以下两行代码:
print("This is :",status)
print("Text is :",status.text)
这两行代码测试requests.get(url)返回值的内容。