È possibile costruire code di lavoro in Erlang?
Domanda
Ho visto molti esempi di chat in Erlang, ma per quanto riguarda gli elenchi, come una coda di lavoro? Se voglio creare un sistema di code di lavoro, come un sistema di gestione dei progetti, è possibile riordinare i messaggi in una cassetta postale di processo o devo utilizzare le priorità dei messaggi? Esistono esempi di sistemi di flusso di lavoro integrati in Erlang?
Soluzione
Non è possibile riordinare i messaggi nelle code dei messaggi di processo in Erlang.
Puoi, tuttavia, ricevere in modo selettivo in cui puoi ricevere il messaggio che ritieni più importante prima. Non è del tutto uguale ma funziona per la maggior parte degli scopi.
Ecco un esempio:
receive
{important, Msg} ->
handle(Msg)
after 0 ->
ok
end,
receive
OtherMsg ->
handle(Msg)
end
Differisce da:
receive
{important, Msg} ->
handle(Msg);
OtherMsg ->
handle(Msg)
end
In quanto eseguirà sempre la scansione dell'intera coda dei messaggi alla ricerca di {important, Msg}
prima di continuare a gestire il resto dei messaggi. Significa che questi tipi di messaggi saranno sempre gestiti prima di tutti gli altri, se esistono. Questo ovviamente ha un certo costo in termini di prestazioni (impiega più tempo a scansionare l'intera coda due volte).
Altri suggerimenti
Le cassette postali di processo funzionano abbastanza bene così come lo sono per le code dei lavori.
Basta che i tuoi messaggi includano informazioni sufficienti in modo che i modelli di ricezione selettiva siano facili da scrivere e non sentirai la necessità di riordinare il contenuto della cassetta postale.
Se è necessario riordinare i messaggi, è possibile seguire il modello gatekeeper: reificare la cassetta postale come processo separato. Quando il processo originale è pronto per un altro messaggio, il gatekeeper può calcolare quale messaggio inoltrare, con qualsiasi regola tu scelga.