2012-02-12 20 views
7

मैं ओकैम में हूं।ओकैमल घटना/चैनल ट्यूटोरियल?

मैं नोड्स संवाद स्थापित करने के लिए कैसे जल्दी से संदेशों विभिन्न संचार योजनाओं आदि

के तहत प्रचार नोड्स 1. भेजने और 2. एक निश्चित संदेश प्राप्त कर सकते हैं को देखने के लिए अनुकरण करने के लिए देख रहा हूँ। मुझे लगता है कि करने के लिए स्पष्ट बात यह है कि प्रत्येक नोड एक अलग थ्रेड के रूप में होता है।

स्पष्ट रूप से आप ईवेंट मॉड्यूल और चैनलों का उपयोग करके एक दूसरे को संदेश पास करने के लिए थ्रेड प्राप्त कर सकते हैं, लेकिन मुझे इसका कोई उदाहरण नहीं मिल रहा है। क्या कोई मुझे सही दिशा में इंगित कर सकता है या बस मुझे एक साधारण प्रासंगिक उदाहरण दे सकता है?

बहुत बहुत धन्यवाद।

उत्तर

6

यदि आप सिमुलेशन का प्रयास करने जा रहे हैं, तो आपको केवल थ्रेड का उपयोग करने से अपने नोड्स पर बहुत अधिक नियंत्रण की आवश्यकता होगी — या कम से कम, बिना किसी मुख्य दर्द के।

सिमुलेशन पर पूर्ण नियंत्रण रखने के लिए विषय के लिए मेरा व्यक्तिपरक दृष्टिकोण एक सरल, सिंगल-थ्रेडेड वर्चुअल मशीन बनाना होगा। OCaml में ऐसा करने का सबसे आसान तरीका है (जैसा कि LWT में किया जाता है, उदाहरण के लिए) एक इकाई की तरह संरचना का उपयोग करना है:

(* A thread is a piece of code that can be executed to perform some 
    side-effects and fork zero, one or more threads before returning. 
    Some threads may block when waiting for an event to happen. *) 
type thread = < run : thread list ; block : bool > 

(* References can be used as communication channels out-of-the box (simply 
    read and write values ot them). To implement a blocking communication 
    pattern, use these two primitives: *) 

let write r x next = object (self) 
    method block = !r <> None 
    method run = if self # block then [self] 
       else r := Some x ; [next()] 
end 

let read r next = object (self) 
    method block = !r = None 
    method run = match r with 
        | None -> [self] 
        | Some x -> r := None ; [next x] 
end 

आप इस तरह के एक "समय जोड़ने के रूप में बेहतर पुरातन आपकी आवश्यकताओं के अनुरूप है कि, बना सकते हैं आपके चैनलों में संपत्ति "प्रेषण के लिए आवश्यक है।

अगला चरण सिमुलेशन इंजन को परिभाषित कर रहा है।

(* The simulation engine can be implemented as a simple queue. It starts 
    with a pre-defined set of threads and returns when no threads are left, 
    or when all threads are blocking. *) 
let simulate threads = 
    let q = Queue.create() in 
    let() = List.iter (fun t -> Queue.push t q) threads in 
    let rec loop blocking = 
    if Queue.is_empty q then `AllThreadsTerminated else 
     if Queue.length q = blocking then `AllThreadsBlocked else 
     let thread = Queue.pop q in 
     if thread # block then ( 
      Queue.push thread q ; 
      loop (blocking + 1) 
     ) else ( 
      List.iter (fun t -> Queue.push t q) (thread # run) ; 
      loop 0 
     ) 
    in 
    loop 0 

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

अंतिम चरण अनुकरण को क्रियान्वित कर रहा है। यहां, मैं दो धागे यादृच्छिक संख्याओं को पीछे और पीछे भेज रहा हूं।

let rec thread name input output = 
    write output (Random.int 1024) (fun() -> 
    read input (fun value -> 
     Printf.printf "%s : %d" name value ; 
     print_newline() ; 
     thread name input output 
)) 

let a = ref None and b = ref None 
let _ = simulate [ thread "A -> B" a b ; thread "B -> A" b a ]   
+0

यह एक शानदार जवाब है, बहुत प्रेरक है। – Tiemen

5

ऐसा लगता है जैसे आप जॉन रिपी के Concurrent ML के बारे में सोच रहे हैं। ओकैमल here के लिए कुछ ऐसा ही लगता है।

जवाब @Thomas दिया है

भी मूल्यवान है, लेकिन मैं पढ़ने की सिफारिश करेंगे आप समवर्ती प्रोग्रामिंग की इस शैली उपयोग करना चाहते हैं जॉन रेपी के PhD thesis जो अत्यंत पठनीय है और CML और कुछ पर्याप्त पीछे प्रेरणा का एक बहुत स्पष्ट उपचार देता है इसके उपयोग के उदाहरण। यदि आप अर्थशास्त्र में रुचि नहीं रखते हैं तो दस्तावेज़ अभी भी पठनीय है यदि आप उस भाग को छोड़ देते हैं।

8

हां, आप OCaml के Event मॉड्यूल का उपयोग कर सकते हैं। आप ऑनलाइन O'Reilly book में इसके उपयोग का एक उदाहरण पा सकते हैं।

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