异步操作指的是每个终端在消息传输中使用独立的时钟源。具体来说,异步操作中的每一个任务都有一个或多个回调函数(callback)。当一个任务结束后,不是立即执行下一个任务,而是执行相应的回调函数。同时,下一个任务会在前一个任务还在等待回调函数执行时就开始执行。因此,程序的执行顺序与任务的排列顺序是不一致的。
异步操作的优点主要有以下几点:
然而,异步操作也存在一些缺点:
在 Python 中,async
和 await
是用于处理异步编程的关键字,它们一起工作,使得编写异步代码更加直观和简单。异步编程是一种编程模型,它允许程序在等待某些操作(如 I/O 操作)完成时,继续执行其他任务,从而提高程序的响应性和效率。
async
关键字用于定义异步函数。异步函数使用 async def
语法,而不是普通的 def
语法。异步函数内部通常包含 await
表达式,用于等待异步操作完成。
示例:
async def my_async_function():
print("Start of my_async_function")
await some_other_async_function()
print("End of my_async_function")
在这个例子中,my_async_function
是一个异步函数。它首先打印一条消息,然后等待 some_other_async_function
完成(假设这也是一个异步函数),最后打印另一条消息。
await
关键字用于在异步函数中等待异步操作完成。它只能用在异步函数内部。当 Python 遇到 await
表达式时,它会暂停当前函数的执行,直到等待的异步操作完成。
示例:
import asyncio
async def my_async_function():
print("Start of my_async_function")
await asyncio.sleep(1) # 等待 1 秒
print("End of my_async_function")
# 获取事件循环
loop = asyncio.get_event_loop()
# 运行异步函数
loop.run_until_complete(my_async_function())
在这个例子中,my_async_function
使用了 await
来等待 asyncio.sleep(1)
完成。这会导致函数暂停执行 1 秒,然后继续执行。
await
:你不能在普通函数中使用 await
。await
调用其他异步函数:这是异步编程模型的核心部分,它允许程序在等待异步操作完成时继续执行其他任务。asyncio
库进行事件循环和调度:asyncio
是 Python 的标准异步 I/O 库,它提供了用于异步编程的各种工具和功能。try/except
块来捕获和处理这些异常。首先,我们需要一个异步函数来模拟获取网页内容的过程。
import asyncio
import aiohttp
async def fetch_page(session, url):
async with session.get(url) as response:
return await response.text()
然后,我们可以创建一个异步函数来并发地获取多个网页的内容。这个函数使用了asyncio.gather
来并发执行多个异步任务。
async def fetch_multiple_pages(urls):
async with aiohttp.ClientSession() as session:
tasks = [fetch_page(session, url) for url in urls]
return await asyncio.gather(*tasks)
最后,我们可以编写一个主函数来调用这个异步函数,并打印出获取到的网页内容。
async def main():
urls = [
'https://example.com',
'https://google.com',
'https://python.org',
]
contents = await fetch_multiple_pages(urls)
for url, content in zip(urls, contents):
print(f"Contents of {url}:\n{content[:100]}...\n")
# Python 3.7+
asyncio.run(main())
在这个例子中,fetch_multiple_pages
函数会并发地获取多个网页的内容,而不是一个接一个地顺序获取。这大大提高了程序的效率,特别是在网络请求较多的情况下。