2014-06-16 11 views
6

क्या एफ # एस असिन से परिणाम हैं। आदेश नौकरियों में आने के लिए समानांतर ऑपरेशन जमा किया गया था? मेरा नमूना कोड परिणामों को क्रम में लौटाता है, लेकिन मुझे एमएसडीएन दस्तावेज़ों में कोई उल्लेख नहीं मिल रहा है, या एफ # स्पेक, यह सुनिश्चित करता है कि यह होना चाहिए - यह एक संयोग नहीं है।क्या F # Async.Parallel परिणाम क्रम में होने की गारंटी है?

let r = System.Random() 
Async.Parallel [ 
    for i in 0..10 -> 
     async { 
      let rand_num = r.Next(10) 
      do! Async.Sleep(rand_num) (* Simulate jobs taking a variable amount of time *) 
      printfn "%i %i" i rand_num 
      return i 
     } 
] 
|> Async.RunSynchronously 
|> printfn "%A" 

यहाँ और उत्पादन है:

यहाँ मेरी नमूना कोड है।

0 0 
5 1 
4 1 
3 3 
10 6 
9 4 
7 5 
2 5 
1 5 
8 7 
6 9 
[|0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10|] 

आप देख सकते हैं कि इस समय में, async कार्यों अनिश्चित क्रम में पूरे, फिर भी परिणामी सरणी सॉर्ट हो जाता है। क्या यह व्यवहार गारंटी है?

उत्तर

11

फिलहाल, फ़ंक्शन का स्रोत लिखा गया है ताकि यह गारंटी लागू हो। परिभाषा के लिए control.fs around line #1300 को देखते हुए, हम देख सकते हैं समारोह उत्पादन सरणी में परिणाम डालता है

let recordSuccess i res = 
    results.[i] <- res; 
    finishTask(Interlocked.Decrement count) 

इस समारोह इस सेगमेंट में कहा जाता है

tasks |> Array.iteri (fun i p -> 
    queueAsync 
     innerCTS.Token 
     // on success, record the result 
     (fun res -> recordSuccess i res) 

जहां tasks अनुसार क्रमबद्ध में मूल कार्य है आदेश। यह गारंटी देता है कि आउटपुट सूची इनपुट के समान क्रम में है।

let rec fib x = if x < 2 then 1 else fib(x-1) + fib(x-2) 

let fibs = 
    Async.Parallel [ for i in 0..40 -> async { return fib(i) } ] 
    |> Async.RunSynchronously 

printfn "The Fibonacci numbers are %A" fibs //I changed this line to be accurate 

System.Console.ReadKey(true) 

तो कल्पना उत्पादन क्रम की गारंटी नहीं किया था, इस कोड होगा: -

अद्यतन

कल्पना कम से कम सूचित करते हैं कि आदेश तय हो गई है लगता है कि यह इस कोड शामिल गलत हो

+1

यह मुझे इस तथ्य की याद दिलाता है कि एक पूर्णांक की 'गेटहाशकोड' विधि केवल पूर्णांक लौटाती है। एक spec आवश्यकता के विपरीत, यह एक कार्यान्वयन विस्तार है। मैं उस व्यवहार के आधार पर नहीं अनुशंसा करता हूं। –

+3

@ क्रिस्टोफर स्टेवेन्सन - मैंने कुछ खुदाई की और कल्पना कम से कम यह दर्शाती है कि आउटपुट ऑर्डर की गारंटी है –

संबंधित मुद्दे