假设我想要抓取一个网页并提取一些数据。我很可能会写出以下代码:
尽管上述工作流会生成多个线程,但由于工作流中的每个项都依赖于前一个项,因此执行顺序是串行的。在其他线程返回之前,不可能评估工作流中的任何更深层次的项。
在上面的代码中,有多个
如果没有,那么如何更改此代码以利用多个
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!
语句?