2013-10-30 20 views
18

मैं विचार और scalaz समवर्ती पैकेज, मुख्य रूप से भविष्य और टास्क कक्षाएं, लेकिन पीछे उद्देश्य को समझने के लिए कोशिश कर रहा हूँ समझने पर एक छोटी सी मदद की जब उन्हें कुछ आवेदन में उपयोग करते हुए, यह अब दूर सरल अनुक्रमिक एनालॉग से है, जबकि scala.concurrent.Future, बेहतर तो बेहतर काम करता है। क्या कोई भी स्केलज़ के साथ समवर्ती/एसिंक्रोनस एप्लिकेशन लिखने पर अपने अनुभव के साथ साझा कर सकता है, मूल रूप से इसका उपयोग async विधि का सही तरीके से कैसे करें? के रूप में मैं स्रोतों से समझते हैं async मानक future करने के लिए कॉल की तरह एक अलग थ्रेड का उपयोग नहीं करता, या scalaz कार्यों से fork/apply तरीकों, तो क्यों यह async तो कहा जाता है? क्या इसका मतलब है कि स्कालज़ के साथ वास्तविक सहमति प्राप्त करने के लिए मुझे हमेशा fork(now(...)) या apply पर कॉल करना होगा?Scalaz भविष्य और टास्क

उत्तर

17

मैं एक scalaz विशेषज्ञ नहीं हूँ, लेकिन मैं आपको एक छोटा सा मदद करने के लिए कोशिश करेंगे। मुझे अपने प्रश्नों का उत्तर एक-एक करके करने का प्रयास करें:

1) क्या कोई भी स्केलज़ के साथ समवर्ती/असीमित अनुप्रयोग लिखने पर अपने अनुभव के साथ साझा कर सकता है, मूल रूप से इसकी एसिंक विधि का सही तरीके से उपयोग कैसे करें?

चलो पहले async हस्ताक्षर पर एक नज़र डालें:

def async[A](listen: (A => Unit) => Unit): Future[A]

यह पहली बार में थोड़ा गुप्त हो सकता है इसलिए हमेशा के रूप में यह अच्छा विचार संभव उपयोग के मामलों को समझता है करने के लिए परीक्षण को देखने के लिए है। हम सिर्फ हस्ताक्षर (A => Unit) => Unit के समारोह का उपयोग कर नए भविष्य का निर्माण हस्ताक्षर Future.async से जानते हैं

"when constructed from Future.async" ! prop{(n: Int) => 
    def callback(call: Int => Unit): Unit = call(n) 
    Future.async(callback).run must_== 
} 

: https://github.com/scalaz/scalaz/blob/scalaz-seven/tests/src/test/scala/scalaz/concurrent/FutureTest.scala में आप निम्नलिखित कोड मिल सकता है। इसका वास्तव में क्या अर्थ है कि Future.async पैरामीटर फ़ंक्शन के रूप में लेता है जो दिए गए कॉलबैक के लिए सभी आवश्यक गणना करता है और उस कॉलबैक को परिणाम पास करता है।
यह ध्यान रखना महत्वपूर्ण है कि Future.async स्वयं पर कोई भी गणना नहीं चलाता है, यह केवल बाद में चलाने के लिए संरचना तैयार करता है।

2) जैसा कि मैं स्रोतों से समझता हूं async मानक भविष्य में कॉल जैसे अलग थ्रेड का उपयोग नहीं करता है, या स्केलज़ कार्यों से फोर्क/लागू विधियों का उपयोग नहीं करता है, तो इसे एसिंक क्यों कहा जाता है?

आप सही हैं। प्रतीत होता है कि केवल fork और apply धागे का उपयोग करके कुछ भी चल रहा है, जो implicit pool: ExecutorService वाले हस्ताक्षरों को देखकर नोटिस करना आसान है। मैं यहां लेखकों के लिए बात नहीं कर सकता, लेकिन मुझे लगता है कि एसिंक कॉलबैक से संबंधित है। इसका मतलब यह है कि इसे भविष्य में अवरुद्ध करने के बजाय अंत में परिणामस्वरूप आप एसिंक्रोनस कॉलबैक का उपयोग करेंगे।

3) क्या इसका मतलब यह है कि स्केलज़ के साथ वास्तविक सहमति प्राप्त करने के लिए मुझे हमेशा कांटा (अब (...)) या आवेदन करना होगा?

मैं क्या कह सकता हूँ से, हाँ। बस ध्यान दें कि जब आप सिंटैक्स Future(x) का उपयोग कर भविष्य बना रहे हैं तो आप यहां apply विधि का उपयोग कर रहे हैं, इसलिए यह एक प्रकार का डिफ़ॉल्ट व्यवहार है (जो ठीक है)।

यदि आप स्केलज़ फ़्यूचर्स के डिज़ाइन को बेहतर ढंग से समझना चाहते हैं तो मैं आपको "Functional Programming in Scala" पढ़ने की सलाह दे सकता हूं। मेरा मानना ​​है कि यह पुस्तक मुख्य स्कालज़ योगदानकर्ताओं द्वारा लिखी गई है और अध्याय 7 पूरी तरह कार्यात्मक समांतरता पुस्तकालय के लिए एपीआई डिजाइन करने पर चर्चा करता है। यह स्कालज़ भविष्य के समान नहीं है, लेकिन आप कई समानताएं देख सकते हैं।

2

आप स्कालज़ टास्क और फ्यूचर के बारे में अद्भुत टिमोथी पेरेट blog post भी पढ़ सकते हैं जिसमें कई स्पष्ट विवरण शामिल नहीं हैं।

1

async एसिंक, कॉलबैक-आधारित API को Future के रूप में अनुकूलित करने के लिए उपयोग किया जाता है। इसे async कहा जाता है क्योंकि इसकी अपेक्षा की जाती है कि इसका उपयोग किसी ऐसे चीज के साथ किया जाएगा जो असीमित रूप से चलता है, शायद कॉलबैक को लाइन के नीचे कहीं और थ्रेड से कॉल करना। यह "असली" समवर्ती है, बशर्ते एपीआई जिसे आप कॉल कर रहे हैं, वास्तव में इसे अतुल्यकालिक रूप से उपयोग करता है (उदाहरण के लिए मैं Future.async का उपयोग एडब्ल्यूएस एसडीके के एसिंक भागों के साथ AmazonSimpleDBAsyncClient) के साथ करता हूं।

यदि आप चाहते हैं scalaz Task एपीआई से 'असली' संगामिति सीधे आप जा रहा है सुरक्षित/नियतात्मक और restartable, संगामिति केवल जब स्पष्ट रूप से अनुरोध किया के साथ की ओर fork या gatherUnordered जैसी चीजों का उपयोग करने, एपीआई डिफ़ॉल्ट से कई के रूप में की जरूरत है।

1

जब नक्शा और साथ कार्य रचना flatMap आप कांटा का उपयोग नहीं करके एक प्रदर्शन जीत प्राप्त कर सकते हैं, देखें:

http://blog.higher-order.com/blog/2015/06/18/easy-performance-wins-with-scalaz/

+2

इस उत्तर ब्लॉग का संदर्भ, लेकिन यहाँ प्रासंगिक जानकारी शामिल करके सुधार किया जा सकता। भविष्य में मौजूद ब्लॉग पर भरोसा करने का कोई तरीका नहीं है। – axlj

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