河北响应式网站建设平台,郑州网站权重,vi设计的基本要素,新公司网站建设费用怎么入账文章目录 任务处理方式异步操作的优缺点async和awiatasyncawait使用 async/await 的注意事项示例 前言#xff1a;此篇文章是在文心一言的辅助下完成的。 任务处理方式
同步操作#xff1a;同步操作是指所有的操作都完成后#xff0c;才返回给用户结果。当一个任务发出请求… 文章目录 任务处理方式异步操作的优缺点async和awiatasyncawait使用 async/await 的注意事项示例 前言此篇文章是在文心一言的辅助下完成的。 任务处理方式
同步操作同步操作是指所有的操作都完成后才返回给用户结果。当一个任务发出请求并等待响应时如果未收到响应该任务就会被阻塞并一直等待直到收到响应为止。例如在一个同步过程中如果有一个函数需要较长时间才能返回结果那么主线程将一直等待该函数的返回期间无法执行其他任务。异步操作异步操作是指两个或多个任务相互独立地执行其中一个任务不需要等待另一个任务的完成就能开始执行自己的操作。即使某个任务需要等待其他任务的结果它也不会被阻塞而是可以继续执行后续的操作。例如在异步编程中即使有一个函数需要较长时间才能返回结果主线程也可以继续执行后面的语句当该函数返回结果后通常会通过回调函数的方式通知主线程并在回调函数中处理该任务的结果。
异步操作的优缺点
异步操作指的是每个终端在消息传输中使用独立的时钟源。具体来说异步操作中的每一个任务都有一个或多个回调函数callback。当一个任务结束后不是立即执行下一个任务而是执行相应的回调函数。同时下一个任务会在前一个任务还在等待回调函数执行时就开始执行。因此程序的执行顺序与任务的排列顺序是不一致的。
异步操作的优点主要有以下几点
无需额外的线程负担异步操作无需创建新的线程来处理任务而是使用回调的方式进行处理这降低了系统的开销。减少死锁的可能性在设计良好的情况下异步操作的处理函数可以不必使用共享变量或者至少可以减少共享变量的数量从而降低了发生死锁的可能性。提高程序响应性异步操作允许在等待某些任务如I/O操作完成时继续执行其他任务从而提高了程序的响应性和效率。适用于I/O密集型应用程序由于异步操作在处理I/O操作时具有优势因此它特别适用于这类应用程序。
然而异步操作也存在一些缺点
编程复杂度较高编写异步操作的程序复杂度相对较高主要因为需要使用回调方式进行处理这与普通人的思维方式有所出入。难以调试由于异步操作的非顺序性和回调机制调试过程可能会变得相对困难。错误处理复杂在异步编程中错误处理可能变得更为复杂因为错误可能发生在回调函数中需要特别注意错误传播的路径。
async和awiat
在 Python 中async 和 await 是用于处理异步编程的关键字它们一起工作使得编写异步代码更加直观和简单。异步编程是一种编程模型它允许程序在等待某些操作如 I/O 操作完成时继续执行其他任务从而提高程序的响应性和效率。
async
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
await 关键字用于在异步函数中等待异步操作完成。它只能用在异步函数内部。当 Python 遇到 await 表达式时它会暂停当前函数的执行直到等待的异步操作完成。
示例
import asyncioasync 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 秒然后继续执行。
使用 async/await 的注意事项
只能在异步函数中使用 await你不能在普通函数中使用 await。异步函数通常使用 await 调用其他异步函数这是异步编程模型的核心部分它允许程序在等待异步操作完成时继续执行其他任务。异步函数通常使用 asyncio 库进行事件循环和调度asyncio 是 Python 的标准异步 I/O 库它提供了用于异步编程的各种工具和功能。注意异常处理异步函数中可能会抛出异常你需要使用 try/except 块来捕获和处理这些异常。
示例
首先我们需要一个异步函数来模拟获取网页内容的过程。
import asyncio
import aiohttpasync 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(fContents of {url}:\n{content[:100]}...\n)# Python 3.7
asyncio.run(main())在这个例子中fetch_multiple_pages函数会并发地获取多个网页的内容而不是一个接一个地顺序获取。这大大提高了程序的效率特别是在网络请求较多的情况下。