2013-04-11 14 views
9

में कॉल रोकने के लिए वायदा Akka प्रलेखन कहते हैं:स्काला

तुम सिर्फ एक भविष्य के अंदर अवरुद्ध कॉल लपेट और है कि इसके बजाय के साथ काम करने के लिए परीक्षा हो सकती है, लेकिन इस रणनीति भी आसान है: आप काफी होने की संभावना है आवेदन लोड होने के दौरान बाधाओं को ढूंढें या मेमोरी या धागे से बाहर निकलें।

वे निम्नलिखित रणनीति का सुझाव:

  • एक Future भीतर अवरुद्ध कॉल करते हैं, समय में किसी भी बिंदु पर इस तरह के कॉल की संख्या पर एक ऊपरी बाध्य सुनिश्चित (इस के कार्यों में से एक असीम संख्या प्रस्तुत करने प्रकृति आपकी याददाश्त या थ्रेड सीमा को समाप्त कर देगी)।

  • Future के भीतर अवरुद्ध कॉल करें, जो थ्रेड पूल की आपूर्ति पर ऊपरी सीमा के साथ एक थ्रेड पूल प्रदान करता है जो कि हार्डवेयर के लिए उपयुक्त है, जिस पर एप्लिकेशन चलता है।

क्या आप उन रणनीतियों के किसी भी कार्यान्वयन के बारे में जानते हैं?

उत्तर

16

वायदा execution contexts के भीतर चलाए जाते हैं। यह Future एपीआई से स्पष्ट है: किसी भी कॉल जिसमें भविष्य में कुछ कॉलबैक संलग्न करना या मनमानी गणना से भविष्य बनाने या किसी अन्य भविष्य से भविष्य बनाने के लिए एक निहित उपलब्ध ExecutionContext ऑब्जेक्ट की आवश्यकता होती है। तो आप ExecutionContext को ट्यून करके अपने वायदा के लिए समवर्ती सेटअप को नियंत्रित कर सकते हैं जिसमें वे चलते हैं।

उदाहरण के लिए, दूसरी रणनीति आप कुछ

तरह
import scala.concurrent.ExecutionContext 
import java.util.concurrent.Executors 
import scala.concurrent.future 

object Main extends App { 

    val ThreadCount = 10 
    implicit val executionContext = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(ThreadCount)) 

    val f = future { 
    println(s"Hello ! I'm running in an execution context with $ThreadCount threads") 
    } 

} 
+0

धन्यवाद लेकिन यह जावा भी दिखता है। मैं और अधिक "स्कला-आश" दृष्टिकोण की तलाश में हूं। – Michael

+6

खैर, मुझे नहीं लगता कि यह 'scala.concurrent' लाइब्रेरी की तुलना में अधिक स्केल-आश हो जाता है। –

+0

इसके अलावा, इसे http://www.scala-lang.org/files/archive/nightly/docs/library/index.html#scala.concurrent.ExecutionContext – axiopisty

2

अक्का ही यह सब लागू करता है क्या कर सकते हैं लागू करने के लिए, आप अभिनेता में अपने अवरुद्ध कॉल लपेट और फिर dispatchers का उपयोग निष्पादन धागा पूल नियंत्रित करने के लिए कर सकते हैं।

+0

को जोड़ने के लिए, कृपया एक्टोर सिस्टम के डिफॉल्ट डिस्पैचर का उपयोग करने से बचने के लिए फ्यूचर्स को निष्पादित करने से बचें, जिसमें ऐसा करने से अभिनेता के उदाहरणों के लिए बाधा उत्पन्न होगी। इन अवरुद्ध कोडों को निष्पादित करने के लिए समर्पित एक अलग निष्पादन कॉन्टेक्स्ट आवंटित करना बेहतर है। – lolski