2011-09-20 7 views
8

Ho un supervisore con N processi di lavoro. Come al solito il supervisore può inviare un messaggio a un processo di lavoro e c'è un handle_cast che invia una risposta da un operatore al supervisore.Supervisore di Erlang: come verificare se tutti i lavoratori hanno risposto

Come posso verificare che esattamente tutti i lavoratori N abbiano risposto al supervisore? È possibile implementarlo con qualsiasi tipo di gestione degli eventi, ovvero dire al supervisore "Ok, tutti hanno risposto" e non fare in modo che il supervisore verifichi lo stato "Tutti i processi hanno risposto" ogni secondo in un qualche tipo di ETS tabella del registro figlio?

risposta

8

Se si sta parlando di un OTP supervisor, non è possibile inviare un messaggio a un operatore. Un supervisore è un comportamento molto limitato con lo scopo di partire, monitoraggio, riavvio e arresto processi. Nient'altro.

Quindi per risolvere il tuo problema particolare, dovresti avere un processo che è responsabile per l'invio di un messaggio a tutti i lavoratori. Questo processo potrebbe anche tenere un elenco di tutti i lavoratori nel suo stato, "spuntare" (o rimuovere dalla lista) i lavoratori che hanno risposto. È possibile ottenere questo risultato con un elenco di PID e ricevendo risposte dai processi (o monitorando i processi con erlang:monitor/2 se stanno uscendo quando hanno finito) e vedere chi è rimasto.

3

Un'alternativa - che potrebbe (o non potrebbe) applicarsi al caso è quella di utilizzare il comportamento gen_event.

NEGAZIONE

dico "potrebbe" perché dipende da ciò che i vostri "lavoratori" fare il vostro caso specifico. Se sei interessato al contenuto delle loro risposte, potresti preferire di non usare questo approccio, ma nel caso sei interessato solo al fatto che tutti i lavoratori hanno completato i loro compiti - ad esempio i processi di lavoro eseguono qualche calcolo pesante e memorizza il loro risultato parziale su un database, quindi sei pronto per combinare i parziali - gen_event potrebbe essere la strada da percorrere.

FINE DELLA NEGAZIONE

Quindi ...

In OTP, un gestore evento è un oggetto denominato a quali eventi possono essere inviati.

Gli eventi sono messaggi.

Nel gestore eventi, vengono installati zero, uno o più gestori di eventi. Quando il gestore eventi riceve una notifica su un evento, l'evento verrà elaborato da tutti i gestori di eventi installati.

Quindi, in pratica, invece di avere un supervisore e più lavoratori, si ha un gestore di eventi e diversi gestori di eventi.

È quindi possibile utilizzare la funzione gen_event:sync_notify/2:

sync_notify è sincrono, nel senso che restituisca ok dopo l'evento è stato gestito da tutti i gestori di eventi.

Per ulteriori informazioni sul * * gen_event guardare here e there.