【发布时间】:2015-06-23 02:28:01
【问题描述】:
在Read large txt file multithreaded?这行,我怀疑它是否相当于向每个线程传递一个 Seq 的切片块,以及它是否会安全地处理并行性;它是 StreamReader 线程安全的吗?
这是我用来测试的代码(欢迎对使用的模式提出任何建议或批评:))
nthreads = 4
let Data = seq {
use sr = new System.IO.StreamReader (filePath)
while not sr.EndOfStream do
yield sr.ReadLine ()
}
let length = (Data |> Seq.length)
let packSize = length / nthreads
let groups =
[ for i in 0..(nthreads - 1) -> if i < nthreads - 1 then Data |> Seq.skip( packSize * i )
|> Seq.take( packSize )
else Data |> Seq.skip( packSize * i ) ]
let f = some_complex_function_modifiying_data
seq{ for a in groups -> f a }
|> Async.Parallel
|> Async.RunSynchronously
【问题讨论】:
-
根据the documentation,“[StreamReader] 的任何公共静态成员都是线程安全的。不保证任何实例成员都是线程安全的。”由于
ReadLine是一个实例方法,所以不能保证它是线程安全的。 -
但在这种情况下,它应该是无关紧要的,因为
groups是一个列表,在这里不是并行评估的
标签: asynchronous f# streamreader