簡體   English   中英

具有同步設置的異步功能

[英]Async function with sync setup

我是異步編程的新手。

我的理解是,它對於並行運行但涉及大量等待的任務很有用。 例如,下載 10 個 zip 存檔並解壓縮它們可以並行完成,但由於“下載”部分只是等待 CPU 的時間,因此 asyncio 在這里是一個有用的概念。 如果我錯了,請糾正我。

我看過的所有教程都遵循與上述類似的示例問題,並通過創建一堆可等待對象然后將它們全部一起等待來解決它。 (例如通過gather

但是,對我來說,啟動這樣的異步操作(例如下載文件)似乎是一個常見的要求,繼續並行執行其他工作,直到實際需要該文件,然后檢索它。 這基本上就是“期貨”所代表的。

不過,我不知道如何使用異步函數來實現這一點。 如果我不“等待”對download_file的調用,那么它甚至不會執行初始設置並且不會開始下載。 如果我立即“等待”調用,它將等待整個下載完成,而我將無法並行執行任何工作。 我想出的唯一解決方案是讓download_file返回一個可等待的未來。 這真的是最好的方法嗎? 如果是這樣,如果我們仍然必須像在引入“異步”關鍵字之前那樣使用像期貨這樣的對象,那么異步的意義何在?

解決方案(在 asyncio 中)是使用類似的東西:

download_task = asyncio.create_task(download_file(...))
... code continues executing ...

這會在“后台”中生成download_file() (嚇人的引號,因為 asyncio 是單線程的,所以后台沒有真正的東西)。 然后你可以繼續你的業務,通常做其他事情,最重要的是,等待其他事情,當你需要完成await download_task ,使用await download_task來獲取結果。

我想出的唯一解決方案是讓download_file返回一個可等待的未來。

asyncio.create_task()有效地將任何協程(async def)轉換為可等待的未來。

如果是這樣,如果我們仍然必須像在引入“異步”關鍵字之前那樣使用像期貨這樣的對象,那么異步的意義何在?

關鍵是你有協程:一個非常方便的工具來實現組合這些期貨。 您可以編寫一個函數,例如downlooad_file代碼,就好像它是普通的順序代碼一樣,但讓它與一堆其他異步代碼並行運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM