在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中文網其他相關文章!