2012-01-02 14 views
6

Ho pensato, mi piacerebbe poter assegnare diversi messaggi a diverse priorità quando si parla di un processo di erlang.Esiste un modo intelligente per dare ai messaggi priorità diverse?

Vorrei essere in grado di gestire prima i messaggi con priorità alta e quindi con priorità bassa una volta.

ho provato diversi approcci, approccio 1:

loop() -> 
    receive 
     {high, Msg} -> 
      Do something with the message, 
      loop() 
     after 0 -> 
      ok 
    end, 
    receive 
     {low, Msg} -> 
      Do something with the message, 
      loop() 
     after 0 -> 
      loop() 
    end. 

Questo fa il lavoro, ma è tranquillo lento. Immagino che la ricezione debba esaminare tutti i messaggi per vedere se c'è un messaggio "alto" ogni volta che viene eseguito.

Approccio 2:

Ho anche provato a fare un approccio di tipo mediatore in cui un messaggio è stato prima serie ad un 'front-desk' il 'front-desk' poi inviato il messaggio a uno-alta coda o basso-coda e quindi, infine, un 'operaio' filo richieste di posti di lavoro da firsk l'alta coda e se quella coda non ha nulla, poi dal basso della coda, come Ilustrated qui:

enter image description here

Ciò ha avuto il rovescio della medaglia di dover aspettare la richiesta per arrivare in prima fila nelle varie code, forse una sorta di sistema prioritario funzionerebbe:)

C'è un modo più intelligente di fare qualcosa del genere?

risposta

11

Penso che questo documento risponde alla tua domanda:

https://www.erlang-solutions.com/upload/docs/9/erlang11-nystrom.pdf

In sostanza si vuole avere una ricezione nel modo seguente:

receive 
    {hi_priority, Msg} -> Msg 
after 0 -> 
    receive 
    Msg -> Msg 
    end 
end 

Come documentazione del Erlang dice "dopo 0" indica che il timeout si verificherà immediatamente se non ci sono messaggi corrispondenti (prioritari) nella casella di posta.

io non sono a conoscenza di alcun modo più intelligente di farlo :)

+2

Impressionante, Fhat era proprio quello che cercavo :-) –

+0

Condivide la ripresa di ricezione dopo il 'non importanti' messaggi ottenere leggere? Quindi se non ho nulla di importante al momento, continuerà ad aspettare per uno importante dopo aver letto quelli non importanti? – Bula

Problemi correlati