在Python中,异步请求指的是在不阻塞主程序流程的情况下发送HTTP请求。这通常在需要同时发送多个请求或在I/O密集型任务中非常有用。Python有几个库可以用来实现异步HTTP请求,其中最著名的是aiohttp
。
安装 aiohttp
首先,你需要安装aiohttp
库,可以通过pip来安装:
pip install aiohttp
异步请求的基本概念
- 异步编程:允许你执行多个任务而不会互相阻塞。
- 事件循环:一个事件循环是异步编程的核心,它负责管理任务的执行。
- 协程:是一种程序组件,可以让你用同步的方式编写异步代码。
代码示例
以下是一个使用aiohttp
库进行异步HTTP请求的示例:
import aiohttp
import asyncio
# 定义一个异步函数来发送GET请求
async def fetch(url, session):
async with session.get(url) as response:
return await response.text()
# 定义一个函数来创建和管理事件循环
def main(urls):
async with aiohttp.ClientSession() as session:
tasks = [fetch(url, session) for url in urls]
results = asyncio.gather(*tasks)
return results
# 要请求的URL列表
urls = [
'http://example.com',
'http://example.org',
'http://example.net'
]
# 运行事件循环
loop = asyncio.get_event_loop()
results = loop.run_until_complete(main(urls))
# 打印结果
for result in results:
print(result[:100]) # 打印每个响应的前100个字符
import aiohttp
import asyncio
# 定义一个异步函数来发送GET请求
async def fetch(url, session):
async with session.get(url) as response: # 确保这是一个异步函数
return await response.text()
# 定义一个异步函数来创建和管理事件循环
async def main(urls):
async with aiohttp.ClientSession() as session: # 确保这是一个异步函数
tasks = [fetch(url, session) for url in urls]
results = await asyncio.gather(*tasks) # 使用await等待gather完成
return results
# 要请求的URL列表
urls = [
'http://example.com',
'http://example.org',
'http://example.net'
]
# 运行事件循环
loop = asyncio.get_event_loop()
# 因为main函数现在是异步的,我们使用loop.run_until_complete来运行它
results = loop.run_until_complete(main(urls))
# 打印结果
for result in results:
print(result[:100]) # 打印每个响应的前100个字符
在
这个示例中,我们首先定义了一个名为fetch
的异步函数,它使用aiohttp.ClientSession
来发送GET请求。然后,我们在main
函数中创建了一个会话,并为每个URL创建了一个任务列表。使用asyncio.gather
来并发运行这些任务,并等待它们全部完成。
最后,我们使用asyncio.get_event_loop
获取事件循环,并调用run_until_complete
方法来运行main
函数,这将启动异步请求并等待它们完成。
"C:\Program Files\Python37\python.exe" D:/st_dev/ugot1213/test/02异步请求.py
<!doctype html>
<html>
<head>
<title>Example Domain</title>
<meta charset="utf-8" />
<m
<!doctype html>
<html>
<head>
<title>Example Domain</title>
<meta charset="utf-8" />
<m
<!doctype html>
<html>
<head>
<title>Example Domain</title>
<meta charset="utf-8" />
<m
Process finished with exit code 0