Python 3.5 中何時使用wait 以及其局限性
Python 3.5 中的異步主要透過asyncio 庫和等待async/ 來實現文法.了解何時何地利用這些構造對於優化非同步應用程式的效能至關重要。
使用 wait 的決定應取決於程式碼的性質。預設情況下,您的程式碼將同步運行。要引入非同步,您可以使用 async def 定義函數並使用 wait 呼叫它們。但是,確定同步程式碼還是非同步程式碼更適合手邊的任務非常重要。
作為一般經驗法則,在處理 I/O 操作時使用 wait 是有益的。 I/O 操作(例如網路請求或資料庫呼叫)通常本質上是非同步的,可以透過將它們委託給事件循環來顯著加速。
例如,考慮以下同步程式碼:
download(url1) # takes 5 seconds download(url2) # takes 5 seconds # Total time: 10 seconds
使用asyncio和await,可以非同步重寫相同的程式碼,將總的執行時間減少到需要的時間更長操作:
await asyncio.gather( async_download(url1), # takes 5 seconds async_download(url2), # takes 5 seconds ) # Total time: only 5 seconds (plus minimal asyncio overhead)
還要注意的是,如果需要,任何非同步函數都可以自由地利用同步程式碼。但是,應避免在沒有正當理由的情況下將同步程式碼轉換為非同步程式碼,因為它本質上不會帶來任何好處。
非同步程式碼的關鍵考慮因素是長時間運行的同步操作可能會凍結整個程式。任何超過特定閾值(例如 50 毫秒)的同步操作都可能阻止任何並發非同步任務。
為了緩解此問題,您可以將此類操作外包給單獨的進程並等待其結果:
executor = ProcessPoolExecutor(2) async def extract_links(url): ... # If search_in_very_big_file() is a long synchronous operation, offload it to a separate process links_found = await loop.run_in_executor(executor, search_in_very_big_file, links)
最後,值得注意的是,I/O 綁定的同步函數可以使用run_in_executor() 整合到非同步程式碼中使用ThreadPoolExecutor 來最小化與多處理相關的開銷。
以上是在Python 3.5非同步程式設計中什麼時候應該使用`await`,它有什麼限制?的詳細內容。更多資訊請關注PHP中文網其他相關文章!