首頁 > 後端開發 > Python教學 > 什麼時候應該使用 Python 3.5 的 asyncio 的 `await` 功能,什麼時候應該避免使用它?

什麼時候應該使用 Python 3.5 的 asyncio 的 `await` 功能,什麼時候應該避免使用它?

Barbara Streisand
發布: 2024-11-17 04:41:03
原創
907 人瀏覽過

When should you use Python 3.5's `await` feature for asyncio, and when should you avoid it?

何時使用和避免 Python 3.5 的 Asyncio 等待功能

Python 3.5 引入了await 關鍵字以方便使用 asyncio 進行非同步程式設計。然而,並不總是清楚應該等待哪些操作來最大化效率。

確定非同步候選者

經驗法則是等待任何執行 I/ 的函數O 操作,如存取網路或讀取檔案。這些操作可能會長時間阻塞同步程式碼。透過等待它們,asyncio 可以同時執行其他操作。

非同步程式碼的優點

如下面的程式碼片段所示,非同步程式碼可以顯著加快涉及以下操作的操作:多個 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: only 5 sec. (+ little overhead for using asyncio)
登入後複製

具有混合非同步/同步程式碼的函數

非同步函數可以呼叫非同步和同步函數。但是,等待不執行 I/O 操作的同步程式碼沒有任何優勢。這可能會帶來不必要的開銷:

async def extract_links(url):  

    # async_download() was created async to get benefit of I/O
    html = await async_download(url)  

    # parse() doesn't work with I/O, there's no sense to make it async
    links = parse(html)  

    return links
登入後複製

避免長時間運行的同步操作

避免非同步內長時間運行的同步操作(> 50 ms)至關重要函數,因為它們可以凍結所有其他非同步任務。要有效率地處理這些任務:

  • 使用多重處理: 在單獨的進程中執行長時間運行的操作並等待結果:
executor = ProcessPoolExecutor(2)

async def extract_links(url):
    data = await download(url)
    links = parse(data)
    # Now your main process can handle another async functions while separate process running    
    links_found = await loop.run_in_executor(executor, search_in_very_big_file, links)
登入後複製
  • 使用ThreadPoolExecutor: 對於I/O密集型同步任務,例如對 Web 伺服器的請求:
executor = ThreadPoolExecutor(2)

async def download(url):
    response = await loop.run_in_executor(executor, requests.get, url)
    return response.text
登入後複製

以上是什麼時候應該使用 Python 3.5 的 asyncio 的 `await` 功能,什麼時候應該避免使用它?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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