【发布时间】:2019-05-29 04:10:50
【问题描述】:
我正在尝试实现我从 Don Syme 的博客中读到的模式
这表明利用异步 I/O 可以大幅提升性能。我目前正在尝试使用 Array.Parallel.Map 以一种方式“工作”的代码,看看我是否可以使用 Async.Parallel 以某种方式实现相同的结果,但我真的不明白 Async.Parallel,并且无法正常工作。
我有一段代码(为了说明这一点而在下面进行了简化)成功地检索了一个 cusip 的一组数据。 (例如价格序列)
let getStockData cusip =
let D = DataProvider()
let arr = D.GetPriceSeries(cusip)
return arr
let data = Array.Parallel.map (fun x -> getStockData x) stockCusips
因此,这种方法构建了一个数组数组,通过互联网与我的每只股票(可能多达 3000 个)的数据供应商建立连接,并返回给我一个数组数组(每只股票 1 个,带有价格每个系列)。我诚然不明白 Array.Parallel.map 下发生了什么,但我想知道这是否是一种在后台浪费资源的场景,而实际上使用异步 I/O 可能会更快?因此,为了测试这一点,我尝试使用 asyncs 来制作这个函数,我认为下面的函数遵循 Don Syme 文章中使用 URL 的模式,但它不会使用“let!”进行编译。
let getStockDataAsync cusip =
async { let D = DataProvider()
let! arr = D.GetData(cusip)
return arr
}
我得到的错误是: 此表达式应具有类型 Async 但此处具有类型 obj
使用“let”而不是“let!”可以很好地编译,但我认为重点是您需要感叹号才能使命令在不阻塞线程的情况下运行。
所以第一个问题确实是,我上面的语法有什么问题,在 getStockDataAsync 中,然后在更高的层次上,任何人都可以提供一些关于异步 I/O 的额外见解,以及我提出的场景是否会从中受益,使其可能比 Array.Parallel.map 快得多?非常感谢。
【问题讨论】:
标签: f#