我什麼時候應該使用 Python 3.5 的 `await` 以及什麼時候應該避免它?

Susan Sarandon
發布: 2024-11-21 12:45:16
原創
630 人瀏覽過

When should I use Python 3.5's `await` and when should I avoid it?

何時擁抱和何時避免Python 3.5的await

在Python 3.5中,asyncio和await的引入將非同步程式設計帶到了最前沿。這種範式轉變允許更大的並發性和更快的執行速度,但其邊界可能會令人困惑。本文深入探討了何時使用以及何時避免使用 wait 的微妙之處。

在 I/O 操作中採用 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 同步程式碼

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板