在Python 3.5中,asyncio和await的引入将异步编程带到了最前沿。这种范式转变允许更大的并发性和更快的执行速度,但其边界可能会令人困惑。本文深入探讨了何时使用以及何时避免使用 wait 的微妙之处。
采用 wait 的主要理由在于它能够利用异步代码的力量。考虑 I/O 操作,例如网络请求或文件读取。这些操作的同步执行通常会阻塞整个程序,迫使其等待每个任务的完成。相比之下,异步代码允许同时执行这些操作,从而释放程序来处理其他任务。
# Synchronous Way download(url1) # takes 5 sec. download(url2) # takes 5 sec. # Total time: 10 sec. # Asynchronous Way await asyncio.gather( async_download(url1), # takes 5 sec. async_download(url2) # takes 5 sec. ) # Total time: 5 sec. (plus asyncio overhead)
在上面的示例中,异步方法只需一半的时间即可完成,有效地减少了浪费的时间等待 I/O 操作。
而await 擅长处理I/O 操作,不应该不加区别地应用于同步代码。同步代码,例如受 CPU 限制的任务或简单的数据操作,不会从异步范例中受益,并且实际上会引入不必要的开销。
# Synchronous Code That Should Remain Synchronous def parse(html): # This function does not involve any I/O operations. links = extract_links_from_html(html) return links
将同步代码转换为异步代码没有任何意义,可能会导致性能下降。
使用 asyncio 时要考虑的一个关键方面是长时间运行的同步操作对异步生态系统的影响。需要长时间执行(例如超过 50 毫秒)的同步操作可能会冻结所有正在运行的异步操作。
async def extract_links(url): data = await download(url) links = parse(data) # If search_in_very_big_file() takes a long time, # all ongoing async functions (elsewhere in code) will be suspended. links_found = search_in_very_big_file(links)
为了防止这种冻结,请考虑在单独的进程中执行此类长时间运行的操作或在异步上下文中使用线程池进行 I/O 绑定操作。
总之,在处理以下情况时应明智地使用 Python 3.5 中的 wait I/O 操作可利用并发的优势。但是,应该避免异步生态系统中的同步代码和长时间运行的操作,以防止潜在的性能陷阱和瓶颈。仔细考虑这些原则将确保有效利用 Python 3.5 的异步功能。
以上是我什么时候应该使用 Python 3.5 的 `await` 以及什么时候应该避免它?的详细内容。更多信息请关注PHP中文网其他相关文章!