我从Bloomberg API检索数据,并且对缓慢感到非常惊讶。 我的计算是由此限制的IO。将线程阻塞转换为f中的非线程阻塞#
因此,我决定使用一些异步monad生成器来取消它。 运行它后,结果并没有那么好,这是显而易见的,因为我调用了线程阻塞的函数NextEvent。
let outerloop args dic =
...
let rec innerloop continuetoloop =
let eventObj = session.NextEvent(); //This blocks
...
let seqtable = reader.ReadFile(@"C:\homeware\sector.csv", ";".[0], true)
let dic = ConcurrentDictionary<_,_>()
let wf = seqtable |> Seq.mapi (fun i item -> async { outerloop item dic })
wf |> Async.Parallel
|> Async.RunSynchronously
|> ignore
printfn "%A" ret
是否有来包装到阻塞调用非阻塞通话的好办法? 此外,为什么异步框架没有创建尽可能多的线程,因为我有请求(如200)?当我检查我从中得到的值我看到的只有4-5所使用的线程..
UPDATE
我发现为什么它会永远不可能令人信服的理由。 异步操作使用异步指令后的内容并将其安排在线程池中的某处。只要异步函数的使用是正确的,也就是说,总是返回它所源自的线程池,我们可以认为我们是在一个线程上执行。
单线程意味着所有的调度将总是在稍后的某个地方执行,并且阻塞指令无法避免这样的事实:最终一旦它运行,它将不得不在未来某个时刻阻塞worflow。
如何创建200个线程以任何方式帮助您?如果你有200个连接,你将有200个非常慢的连接,而不是几个快速连接。 (不提200 MB的开销。) – svick 2012-03-28 11:12:41
另外,如果你的操作是IO阻塞,那么使用更多的CPU不会给你带来太多好处。速度很慢,因为网络速度很慢,并且您不会通过使用更多线程来提高网络速度。 – svick 2012-03-28 11:23:14
@svick为什么连接IO计算速度慢的连接不会比5个慢速连接好40倍?我可以看到它现在正在处理40个5个操作,这可以通过200个操作中的1个操作更好地处理。或者我错过了什么? – nicolas 2012-03-28 12:18:20