2011-07-13 60 views
0

我有一個需要按特定順序執行的http命令列表。F#List.Map是否保證從左項到右項的執行順序?

Let cmd = [ 
    (Get, "http://login.xxx.com"); 
    (Post, "http://login.xxx.com", "login=name;password=pwd"); 
    ....] 

cmd |> List.map (crawl) 

爬網會自上而下運行http請求(即使在多核計算機中)嗎?如果無法保證執行順序,最好的辦法是什麼?

回答

1

是的,List.map是單線程的,所以執行的順序是有保證的。您只需確保您的爬網功能不會導致異步火災並忘記操作,但事實可能已經如此,因爲它是最簡單的方式,即確保您使用WebClient.DownloadString而不是異步版本。

+0

未來版本的F#會優化它並使其成爲多線程嗎?特別是它是不可變的,這就是函數式編程所擅長的。 – ca9163d9

+3

令人懷疑。自動並行化仍然主要是一個夢想,除了可能在有限的領域。然而,假定不變性,程序員指定的並行化通常是微不足道的(例如,只要將'List.map'更改爲'PSeq.map',給定並行操作符的'PSeq'模塊就行。) – Brian

+0

List.map不會改變輸入,並且它的輸出是不可變的,但傳遞給它的函數可能有副作用。這將我們帶回程序員指定的並行化... –