2010-02-16 6 views
10

निम्नलिखित एर्लैंग कोड पर विचार करें:हार्सेल के टीसीहान डिफर संदेशों को कैसे करें जैसे एरलांग की संदेश कतारें?

-module(testit). 
-export([testit/0]). 

testit() -> 
    Pid = spawn(fun testit_proc/0), 
    Pid ! final, 
    Pid ! one, 
    Pid ! two, 
    io:format("Root finished~n"). 

testit_proc() -> 
    receive 
     one  -> io:format("One~n"); 
     two  -> io:format("Two~n") 
    end, 
    receive 
     one  -> io:format("One~n"); 
     two  -> io:format("Two~n") 
    end, 
    receive 
     one  -> io:format("One~n"); 
     two  -> io:format("Two~n"); 
     final -> io:format("Final~n") 
    end, 
    io:format("Spawn finished~n"). 

आउटपुट है:

Root finished 
One 
Two 
Final 
Spawn finished 

final संदेश की प्रसंस्करण अनिवार्य रूप से पिछली बार प्राप्त होने तक ब्लॉक को पिछले प्राप्त पैटर्न के आधार पर स्थगित कर दिया गया है जो उस संदेश से मेल नहीं खाता है ।

आप हास्केल के टीसीहान के साथ ऐसा कैसे करते हैं?

उत्तर

3

आप एर्लांग की चुनिंदा प्राप्त सुविधा का जिक्र कर रहे हैं। जहां तक ​​मुझे पता है, हास्केल में एसटीएम के समानांतर नहीं है। आपके विकल्पों को या तो इसकी आवश्यकता को हटाने के लिए अपने कोड को दोबारा प्रतिक्रिया देना है (जैसे विभिन्न प्रकार की जानकारी के लिए अलग-अलग कतारों का उपयोग करके), या पुस्तकालय में इस सुविधा को लागू करने के लिए।

चुनिंदा प्राप्तकर्ता का अर्थशास्त्र यह है कि आने वाली संदेश कतार के अतिरिक्त, आपके पास एक स्थगित संदेश सूची भी है। प्राप्त फ़ंक्शन में, आपको किसी मिलान करने वाले संदेशों के लिए पहले स्थगित सूची को स्कैन करना होगा। यदि कोई संदेश मेल खाता है, तो आप इसे सूची से हटा दें और इसे वितरित करें। यदि कोई स्थगित संदेश मेल नहीं खाता है, तो आपको इनबॉक्स पर एक संदेश की प्रतीक्षा करनी होगी। जब कोई संदेश प्राप्त होता है, तो आप जांचते हैं कि यह मेल खाता है या नहीं। यदि ऐसा होता है, तो आप इसे वितरित करते हैं; यदि नहीं, तो आप इसे स्थगित सूची में दबाएं और दोहराएं।

+2

सहमत हुए। ये अर्थशास्त्र मूल 'चैन' या 'टीसीएचएन' पैकेज में मौजूद नहीं हैं - आपको स्वयं को एक डिफेंडर कतार लागू करना होगा। –

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