Hilos en Go

209 views
Skip to first unread message

ines...@gmail.com

unread,
Apr 7, 2013, 3:39:10 PM4/7/13
to golang-...@googlegroups.com

De vueltas pero con Hilos. :)


Tengo un ejercicio de C muy simple de hilos con “Hola desde el hilo ...”, como sigo queriendo medir tiempos con openMP y con Go voy a ver esta vez cuanto de rápido es más o menos con hilos.


Por ejemplo, para saber cuantos hilos voy a utilizar en C con OpenMP es: omp_get_num_threads();


Que en Go traduzco así: runtime.GOMAXPROCS(max_hilos)


Mi cuestión es esta: ¿Cómo sería en Go saber el identificador del hilo?

En C con OpenMP es: omp_get_thread_num();


Así me muestra el resultado por pantalla en C cuando introduzco 2 hilos:


Hola desde el hilo identificado como el numero: 1 del total de 2 hilos

Hola desde el hilo identificado como el numero: 0 del total de 2 hilos


Gracias por leer y por participar.



Zorion

unread,
Apr 10, 2013, 1:23:06 AM4/10/13
to golang-...@googlegroups.com

Hola Inés.
Creo que en golang-nuts comentaron que no hay identificador de "gorrutina".
Puedes guardarlo en una variable local de cada gorrutina.
Hay muchas maneras de hacer eso.

Respecto a esto:
runtime.GOMAXPROCS(max_hilos)
Creo que sirve para decirle al programa cuántos procesadores puede usar, nunca lo he usado, no sé si te dará la información que buscas.
Si no te la da, para saber cuántas gorrutinas están corriendo lo debes contar. No sé si hay alguna manera en el package runtime u otro package.

Saludos

--
 
---
Has recibido este mensaje porque estás suscrito al grupo "golang-spanish" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a golang-spanis...@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.
 
 

ines...@gmail.com

unread,
Apr 10, 2013, 2:11:48 PM4/10/13
to golang-...@googlegroups.com
Hola Zorion,

Con runtime.NumCPU() puedo saber cuántos procesadores puedo usar con runtime.GOMAXPROCS()... (más bien de los que dispongo) .

En este caso no voy a buscar el id del hilo pues.
Gracias por estar ahí.
:)

ines...@gmail.com

unread,
Apr 13, 2013, 2:54:40 PM4/13/13
to golang-...@googlegroups.com

¡¡Hola!!


Estoy con los hilos y las entiendo como que son una goroutina lanzada ... no?

(Esto no es una afirmación, es que me lia y entonces, digo si será el hilo como más parecido... por favor, corregidme!)


Estoy haciendo un ejercicio en el que lanzo una goroutina para que sea concurrente la función de los números primos entre un rango de 2 números y a la vez la estoy enviando para 1 procesador, ..., hasta los 4 que tengo.


func Es_Primo(m int, n int, c chan int) {

Aquí va toda la función para saber si es primo o no.

}

c <- 1

Y aquí le añado un 1 al canal que entiendo estoy ocupándolo para ir enviado el número a comprobar si es primo o no

}


Luego en func main() cuando utilizo la función Es_Primo en la goroutina, creo el canal y lo libero simplemente así:


<- c


Sólo necesito entender bien si es así como creo el canal y lo libero luego, ya que entiendo que envío un 1 para ir enviando la información del número primo al rango que he de mostrar y el canal cuando acaba de recibirlos (envío/recibo) lo libero al final como comento.


Gracias por leer.

Un saludo.

Zorion

unread,
Apr 13, 2013, 5:04:16 PM4/13/13
to golang-...@googlegroups.com
Hola,
No he entendido nada :(

¿Cuál es el objetivo del canal? "c<-1"
Normalmente se me ocurren dos usos para un canal:
-Sincronización/bloqueo entre gorrutinas (puedes enviar un 1 o incluso un struct{}, que tiene tamaño cero)
-Enviar información entre gorrutinas (no son hilos, pero creo que los puedes entender como tales)

Quizás si me pones un trozo de (pseudo)código de tu idea entiendo un poco mejor lo que quieres decir.

Sólo necesito entender bien si es así como creo el canal y lo libero luego, ya que entiendo que envío un 1 para ir enviando la información del número primo al rango que he de mostrar y el canal cuando acaba de recibirlos (envío/recibo) lo libero al final como comento.


No he visto en ningún sitio que crees el canal. Un canal se crea cuando haces el make(chan <tipo>, <opcional buffer>)

Si decides enviar un 1 supongo que será por sincronización ¿o es información que compartes? 
¿Qué significa el rango? ¿Primos que hay en el rango dado?

Espero tu respuesta,
Saludos
Zorion

ines...@gmail.com

unread,
Apr 14, 2013, 3:54:37 AM4/14/13
to golang-...@googlegroups.com
Gracias Zorion por contestarme :)

Como veo que me pierdo aún mucho de entender las goroutinas en Go, pienso que el canal creado es para ir enviando la información de los números primos al procesador o procesadores que voy a utilizar cuando determine qué rango de números primos visualizo.
Si no se cierra el canal (como creo que lo cierro) sólo muestra un número primo ... señal que se queda ocupado el canal y no recibe más...
El canal lo creo en la funcion main() , con c := make(chan int)

Tienes razón, con código se entiende mejor (pq así a seco parece esto una pizarra de tiza medio borrada), y puede que lo que entienda por canal no sea lo que es, en cuanto lo tenga te lo enseño.
Y de enseñarte, que me enseñas más que nada, gracias, ¿no hay manera de comunicarnos más rápidamente? aunque luego lo postee todo aquí en el foro.
;)
Reply all
Reply to author
Forward
0 new messages