2016-03-07 3 views
5

अच्छी तरह से लिखा Akka Concurrency से:अक्का भविष्य - समांतर बनाम समवर्ती?

enter image description here

जैसा कि मैंने समझते हैं, आरेख numSummer और charConcat दोनों बताते हैं, एक ही धागे पर चलेंगे।

क्या समानांतर में प्रत्येक Future को समानांतर में चलाने के लिए संभव है, यानी अलग धागे पर?

+2

बेशक, आंकड़ा बुलाया जाना चाहिए "Flatma:

val numSummer = Future { ... } // execution kicked off val charConcat = Future { ... } // execution kicked off numSummer.flatMap { numsum => charConcat.map { string => (numsum, string) } } 

और अधिकार के लिए पिंग एक साथ अनुक्रमिक रूप से बनाम ", दिया गया है कि बाएं एक समवर्ती है .... – mdm

+0

लेकिन 'समवर्ती' का मतलब है कि एक ही थ्रेड का उपयोग कर रहा है, नहीं? –

+0

जरूरी नहीं है, जहां तक ​​मैं इसे समझता हूं। http://stackoverflow.com/questions/1897993/difference-between-concurrent-programming-and-parallel-programming या https://blogs.oracle.com/yuanlin/entry/concurrency_vs_parallelism_concurrent_programming; क्रमिक होगा जब निष्पादन के बीच कोई ओवरलैप नहीं होगा। – mdm

उत्तर

11

बाईं ओर की तस्वीर है जो समानांतर में चल रही है।

चित्रण का मुद्दा यह है कि Future.apply विधि क्या निष्पादन को शुरू करता है, इसलिए यदि ऐसा नहीं होता जब तक पहले भविष्य के परिणाम flatMap एड है (दाईं ओर चित्र में के रूप में), तो आप डॉन 'है समानांतर निष्पादन प्राप्त नहीं करते हैं।

(ध्यान दें कि द्वारा "की शुरूआत", मेरा मतलब प्रासंगिक ExecutionContext काम के बारे में बताया जाता है। कैसे यह parallelizes एक अलग प्रश्न है और इसकी थ्रेड पूल के आकार जैसी चीजों पर निर्भर हो सकता है।)

बाईं के लिए

समतुल्य कोड:

Future { ... } // execution kicked off 
    .flatMap { numsum => 
    Future { ... } // execution kicked off (Note that this does not happen until 
        // the first future's result (`numsum`) is available.) 
     .map { string => 
     (numsum, string) 
     } 
    } 
संबंधित मुद्दे