Python Asyncio
大家好!今天我们来聊聊Asyncio。 Asyncio是Python中用于编写并发代码的库。
开始之前,说一下并发和并行的概念。 并发(concurrency)和并行(parallelism)是不同的概念。 并发是指程序在同一时间内处理多个任务,但实际上是交替 执行这些任务。而并行是指程序在同一时间 真正地同时执行多个任务,这通常需要多核 处理器来实现。Asyncio主要处理并发。 如果不使用Asyncio,Python默认采用顺序执行 的方式。这意味着代码会按照编写的顺序逐行 执行。在处理I/O密集型任务时,例如网络请求 ,文件读写,或者数据库读写,Python程序会阻塞等待这些操作完成, 导致效率较低。Asyncio通过异步非阻塞的方式 来解决这个问题。(顺便提一嘴:Javascript是天生异步非阻塞)
asyncio中,它使用async/await语法,让我们可以用更简洁 的方式编写异步代码。这个例子展示了如何 使用aiohttp库异步地从多个URL获取内容。 asyncio.gather可以并发运行多个任务,从而 提高程序的效率。通过这种方式,程序不必 等待一个任务完成后再开始下一个任务。
补充说明下:asyncio.gather()函数它接受多个可等待对象作为参数, 并返回这些任务的结果列表。*tasks语法将任务 列表解包为单独的参数传递给gather函数。 因为gather函数中把参数包装为了元组Tuple类型。 此外,zip()函数用于将多个可迭代对象(如列表) 配对在一起。在这个例子中,它将URL列表和结果 列表配对,以便我们可以同时遍历它们并打印结果。
希望这个简单的例子能帮助你理解Asyncio!
代码示例
import asyncio
import aiohttp
async def fetch_url(
session, url
):
async with session.get(
url
) as response:
return await response.text()
async def main():
urls = [
"https://www.pypi.org",
"https://www.python.org",
]
async with aiohttp.ClientSession() \
as session:
tasks = [
fetch_url(session, url)
for url in urls
]
results = await asyncio.gather(
*tasks
)
for url, result in zip(
urls, results
):
print(
f"Fetched {url}: "
f"{len(result)} chars"
)
if __name__ == "__main__":
asyncio.run(main())