2010-02-16 12 views
10

sich das folgende Erlang-Code:Wie kann Haskells TChan Nachrichten wie Erlangs Nachrichtenwarteschlangen verzögern?

-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"). 

Der Ausgang ist:

Root finished 
One 
Two 
Final 
Spawn finished 

Die Verarbeitung der final Nachricht wird im wesentlichen bis der latenten letzte Block aufgrund der vorherigen Muster erhalten erhalten keine passende, dass Botschaft.

Wie machst du das mit Haskells TChan?

Antwort

3

Sie beziehen sich auf die selektive Empfangsfunktion von Erlang. Soweit ich weiß, hat STM in Haskell keine Parallele dazu. Sie können Ihren Code entweder umgestalten, um die Notwendigkeit zu beseitigen (z. B. indem Sie separate Warteschlangen für die verschiedenen Arten von Informationen verwenden, die möglicherweise empfangen werden), oder diese Funktion in einer Bibliothek implementieren.

Die Semantik des selektiven Empfangs besteht darin, dass Sie zusätzlich zur Warteschlange für eingehende Nachrichten auch eine Liste mit verzögerten Nachrichten haben. In der Empfangsfunktion müssen Sie zuerst die zurückgestellte Liste nach übereinstimmenden Nachrichten durchsuchen. Wenn eine Nachricht übereinstimmt, entfernen Sie sie aus der Liste und übermitteln sie. Wenn keine verzögerten Nachrichten übereinstimmen, müssen Sie auf eine Nachricht im Posteingang warten. Wenn eine Nachricht empfangen wird, überprüfen Sie, ob sie übereinstimmt. Wenn es so ist, dann liefern Sie es; Wenn nicht, dann drücken Sie es auf die aufgeschobene Liste und wiederholen.

+2

Einverstanden. Diese Semantik gibt es in den grundlegenden 'Chan'- oder' TChan'-Paketen nicht - Sie müssen selbst eine Zurückstellungswarteschlange implementieren. –

Verwandte Themen