martedì 9 marzo 2010

wait() in Go, How to?

Stamattina sono stato colto da un dubbio che ha fortunatamente trovato una risposta nella ricchissima mailing list di go-language: http://groups.google.com/group/golang-nuts?pli=1

La domanda che mi sono posto è la seguente: esiste un modo intelligente per aspettare che tutte le go routines abbiano finito la loro esecuzione prima di procedere alla chiusura della funzione main?

Stamattina, come al solito, apro le mail e trovo la seguente discussione.

Subito arrivano alcune risposte come ad esempio:
The standard practice in Go seems to be for goroutines to pass to a
channel so signal their end. For example:

package main

func routine(quit chan int) {
// do stuff
quit <- 1

}

func main() {
routineQuit := make(chan int)
go routine(routineQuit)

<-routineQuit // blocks until quit is written to

}

-Daniel

Ma poi arriva questo link che vi invito caldamente a seguire se siete interessati all'argomento come lo sono io perchè lo spiega in modo molto chiaro: link.

A breve altri approfondimenti.
Buon Go a tutti!

lunedì 1 marzo 2010

State Machine in Go-Language - 1^ parte

Comincia con questo articolo una serie di post che tratta un argomento molto attuale e utile. La vastità del mare nel quale ci apprestiamo a navigare avrebbe bisogno di molte e molte pagine di libro per questo ho deciso di spezzettare in più parti la trattazione.

L'utilizzo di macchine a stati mi sembra importante nella programmazione di sistema, soprattutto quando si parla di servizi.
Cosa succede allora quando le state machine incontrano Go?

Ma partiamo "dall'incomincio": ecco un esempio di macchina a stati semplicissima (e anche un po' inutile) che però fa capire in cosa consistono questi arcani.


Questo concetto è molto comodo quando si programma a oggetti. Come abbiamo visto nello scorso articolo il linguaggio Go possiede gli oggetti.
Creiamo dunque il nostro oggetto intorno allo stato interno che per comodità conterrà solo l'indice dello stato in cui ci troviamo.

type InternalState struct  {
myState int;
}

Se prendiamo come modello quello nella figura sopra lo stato interno InternalState dovrà essere inizializzato, poi passare nello stato 1 e successivamente nello stato 2 prima di terminare.

Componiamo allora in questo modo la funzione che andrà a inizializzare la nostra macchina a stati:
func (state * InternalState) Init (inputValue int)
{
state.myState = inputValue;
}

Avremo poi bisogno di due funzioni per ogni stato, una che effettua operazioni di entry ed exit:
func (state * InternalState) Stato1_Entry ()
{
}

func (state * InternalState) Stato1_Exit ()
{
}

func (state * InternalState) Stato2_Entry ()
{
}

func (state * InternalState) Stato2_Exit ()
{
}



Nel prossimo post vedremo invece come unire tutti i componenti appena creati per far transitare lo stato dell'oggetto da quello iniziale a quello finale passando per gli stati intermedi.

Spero inoltre di aver messo qualche pulce nell'orecchio per approfondire un argomento veramente interessante.