我從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