可以說我想刮一個網頁,並提取一些數據。我想最有可能寫的是這樣的:並行使用異步工作流程的最佳實踐
let getAllHyperlinks(url:string) =
async { let req = WebRequest.Create(url)
let! rsp = req.GetResponseAsync()
use stream = rsp.GetResponseStream() // depends on rsp
use reader = new System.IO.StreamReader(stream) // depends on stream
let! data = reader.AsyncReadToEnd() // depends on reader
return extractAllUrls(data) } // depends on data
的let!
告訴F#在另一個線程來執行代碼,然後將結果綁定到一個變量,並繼續處理。上面的示例使用了兩條let語句:一條用於獲取響應,另一條用於讀取所有數據,因此它至少會生成兩條線程(如果我錯了,請糾正我)。
儘管上面的工作流生成了多個線程,但執行順序是串行的,因爲工作流中的每個項目都依賴於前一個項目。在其他線程返回之前,無法評估工作流程中的任何項目。
在上面的代碼中有多個let!
有什麼好處嗎?
如果不是,那麼需要更改此代碼以利用多個let!
語句?
好吧,讓!不產生多個線程,它只是釋放線程句柄回線程池:)我想這帶有少量的開銷,所以我可能不會「讓!」每一行。是否有任何規定放置「讓!」在最佳位置? – Juliet 2009-01-30 17:59:41