2010-02-16 17 views
10

Consideremos el siguiente código de Erlang:¿Cómo hacer que el TChan de Haskell difiera los mensajes como las colas de mensajes de Erlang?

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

La salida es:

Root finished 
One 
Two 
Final 
Spawn finished 

El procesamiento del mensaje final se difiere esencialmente hasta el último bloque de recepción en virtud de las recibir patrones anteriores no coincidentes que mensaje.

¿Cómo se hace esto con Haskell's TChan?

Respuesta

3

Te refieres a la función de recepción selectiva de Erlang. Hasta donde yo sé, STM en Haskell no tiene paralelo. Sus opciones son refactorizar su código para eliminar la necesidad (por ejemplo, utilizando colas separadas para los diferentes tipos de información que pueden recibirse) o implementar esta función en una biblioteca.

La semántica de la recepción selectiva es que, además de la cola de mensajes entrantes, también tiene una lista de mensajes diferidos. En la función de recepción, primero necesita escanear la lista diferida para encontrar los mensajes coincidentes. Si un mensaje coincide, lo quita de la lista y lo entrega. Si no coinciden los mensajes diferidos, debe esperar un mensaje en la bandeja de entrada. Cuando se recibe un mensaje, usted verifica si coincide. Si lo hace, entonces lo entregas; si no, entonces lo empuja a la lista diferida y repite.

+2

De acuerdo. Estas semánticas no existen en los paquetes básicos 'Chan' o' TChan'; deberá implementar una cola diferida usted mismo. –

Cuestiones relacionadas