Threads

15/02/2005 - 22:33 por José Miguel Torres | Informe spam
Hola, tengo un problemita, tengo que ejecutar un proceso
que es algo pesado (3 o 4 segundos) varias veces, en un
siclo for(), como cada iteración esta tardando mucho,
pense en utilizar hilos, pero no conosco mucho de esto,
creen que si tengo que iterar 6 veces sobre un mismo
proceso y esperar 20 segundos por ejemplo, con 6 hilos
trabajando el tiempo de espera se verá reducido??? Y de
ser así como podría hacer para capturar la salida de cada
uno de los hilos? Cada hilo lo que hará será convertir un
array de bytes a una imagen jpg, entonces cada hilo deberá
recibir el array y devolverme la imagen. Bueno mi consulta
es si vale la pena investigar esto de los hilos para
obtener las salidas más rápido o si alfinal y al cabo será
lo mismo. Muchas gracias.

Preguntas similare

Leer las respuestas

#6 Octavio Hernandez
16/02/2005 - 20:29 | Informe spam
Ah, Kravek, muy buena tu aclaración!!!
Yo me olvidé totalmente de que existen los sistema multiproceso, el
hyperthreading etc. y asumí injustamente que la aplicación de JM se iba a
ejecutar de por vida en un PC tan mediocre como el mío :-)
En cuanto al aprovechamiento de los tiempos muertos de E/S, pensé (y creo
que sigo pensando) que como en este caso sus hilos son de una misma
naturaleza no cabría esperar mucha ganancia por esa parte.
Pero efectivamente, donde dije digo debo decir Diego - no estaría nada mal
considerar la utilización de hilos en este caso.
Otro aspecto del que me olvidé totalmente y que ahora me viene a la mente es
el CONCEPTUAL - la utilización de hilos en este caso podría ayudar a mejorar
la arquitectura lógica del programa. Por ejemplo, se podría definir una
clase HiloQueGeneraImagen para encapsular todo el proceso de generación de
una imagen, con lo que quedaría un código más claro y elegante.

Gracias y saludos,

Octavio

"Kravek" <rubengARROBAkailea4.net> escribió en el mensaje
news:
Creo que no todo lo que te han dicho es cierto...

1º) Si tienes procesadores con HiperThreading: en este caso se aprovecha
mejor el HT trabajando en paralelo que si un solo hilo pretende usar el HT
2º) Mientras una tarea está realizando una operación de E/S o está
bloqueada en espera de algún evento se podría estar ejecutando otra (por
ejemplo según se está grabando en disco duro una imagen)
3º) Procesos interdependientes SÍ se pueden lanzar en paralelo si bien hay
que establecer zonas de exclusión mutua, mirar su dependencia, evitar la
inanición y el interbloqueo No es fácil pero se puede hacer
4º) Si tu ordenador es multiprocesador

En resumen, creo que te puede venir muy bien usarhilos y si me dices que
son 6 imágenes a 2 segundos por imagen (total 12 segundos) quizás te baje
a 10 o a 9 segundos el tiempo total, en el peor de los casos como te ha
dicho Octavio conseguirias mayor dinamismo aunque no redujeras el tiempo.

También te diría qu investigaras y mucho sobre concurrencia porque según
como lo implementes puedes conseguir mejor o peor resultado

"Octavio Hernandez" escribió en el mensaje
news:
JM,

Si tu programa tiene necesariamente que esperar de forma síncrona porque
las seis imágenes se generen para seguir adelante, entonces creo que no
vale la pena que investigues hacerlo con hilos. Piensa que de todos modos
a cada hilo le hará falta el mismo tiempo para generar su imagen (un hilo
no puede hacer que la CPU o el acceso a memoria se aceleren, ¿no?), y
además el sistema consumirá un tiempo adicional en lo que llaman el
"context switching" (cambio de contexto de ejecución para pasar de un
hilo a otro).

Razones por las cuales valdría la pena considerar los hilos:
a) si quieres que el programa vaya avanzando en las seis imágenes en
paralelo (por ejemplo, para irlas mostrando en seis ventanitas en la
medida en que se van generando). Aquí los hilos son sencillamente la
herramienta a utilizar.
b) si quieres que el usuario pueda ir haciendo otra cosa mientras se
generan las imágenes. En ese caso tendrías la opción de tener siete hilos
(el principal, que atiende a la intefaz de usuario, y uno para cada una
de las imágenes), o sólo dos hilos (el principal y otro que genera las
seis imágenes secuencialmente).

Slds - Octavio

"José Miguel Torres" escribió en el mensaje
news:086101c513a5$ee6d76d0$
Hola, tengo un problemita, tengo que ejecutar un proceso
que es algo pesado (3 o 4 segundos) varias veces, en un
siclo for(), como cada iteración esta tardando mucho,
pense en utilizar hilos, pero no conosco mucho de esto,
creen que si tengo que iterar 6 veces sobre un mismo
proceso y esperar 20 segundos por ejemplo, con 6 hilos
trabajando el tiempo de espera se verá reducido??? Y de
ser así como podría hacer para capturar la salida de cada
uno de los hilos? Cada hilo lo que hará será convertir un
array de bytes a una imagen jpg, entonces cada hilo deberá
recibir el array y devolverme la imagen. Bueno mi consulta
es si vale la pena investigar esto de los hilos para
obtener las salidas más rápido o si alfinal y al cabo será
lo mismo. Muchas gracias.





Respuesta Responder a este mensaje
#7 Kravek
16/02/2005 - 22:52 | Informe spam
Efectivamente Octavio lo del diseño conceptual es muy importante sobre todo
según crece el sistema

Yo sigo diciendo que en este caso la E/S es muy importante claro que para
eso lo que habría que hacer es lanzar N hilos (uno por cada imagen) y luego
tener otro hilo que es el encargado de escribir las imágenes, podría recibir
1 mensaje de cada uno de los otros hilos con la imagen ya codificada y de
ese modo podría serializar la E/S

En cualquier caso hay que prestar muuucha atención sobretodo al interbloqueo
y el sincronismo

Otra cosa me reitero que quizás lo mejor es mirar la algoritmia de los
procesos de codificación de imágenes

"Octavio Hernandez" escribió en el mensaje
news:%

Ah, Kravek, muy buena tu aclaración!!!
Yo me olvidé totalmente de que existen los sistema multiproceso, el
hyperthreading etc. y asumí injustamente que la aplicación de JM se iba a
ejecutar de por vida en un PC tan mediocre como el mío :-)
En cuanto al aprovechamiento de los tiempos muertos de E/S, pensé (y creo
que sigo pensando) que como en este caso sus hilos son de una misma
naturaleza no cabría esperar mucha ganancia por esa parte.
Pero efectivamente, donde dije digo debo decir Diego - no estaría nada mal
considerar la utilización de hilos en este caso.
Otro aspecto del que me olvidé totalmente y que ahora me viene a la mente
es el CONCEPTUAL - la utilización de hilos en este caso podría ayudar a
mejorar la arquitectura lógica del programa. Por ejemplo, se podría
definir una clase HiloQueGeneraImagen para encapsular todo el proceso de
generación de una imagen, con lo que quedaría un código más claro y
elegante.

Gracias y saludos,

Octavio

"Kravek" <rubengARROBAkailea4.net> escribió en el mensaje
news:
Creo que no todo lo que te han dicho es cierto...

1º) Si tienes procesadores con HiperThreading: en este caso se aprovecha
mejor el HT trabajando en paralelo que si un solo hilo pretende usar el
HT
2º) Mientras una tarea está realizando una operación de E/S o está
bloqueada en espera de algún evento se podría estar ejecutando otra (por
ejemplo según se está grabando en disco duro una imagen)
3º) Procesos interdependientes SÍ se pueden lanzar en paralelo si bien
hay que establecer zonas de exclusión mutua, mirar su dependencia, evitar
la inanición y el interbloqueo No es fácil pero se puede hacer
4º) Si tu ordenador es multiprocesador

En resumen, creo que te puede venir muy bien usarhilos y si me dices que
son 6 imágenes a 2 segundos por imagen (total 12 segundos) quizás te baje
a 10 o a 9 segundos el tiempo total, en el peor de los casos como te ha
dicho Octavio conseguirias mayor dinamismo aunque no redujeras el tiempo.

También te diría qu investigaras y mucho sobre concurrencia porque según
como lo implementes puedes conseguir mejor o peor resultado

"Octavio Hernandez" escribió en el mensaje
news:
JM,

Si tu programa tiene necesariamente que esperar de forma síncrona porque
las seis imágenes se generen para seguir adelante, entonces creo que no
vale la pena que investigues hacerlo con hilos. Piensa que de todos
modos a cada hilo le hará falta el mismo tiempo para generar su imagen
(un hilo no puede hacer que la CPU o el acceso a memoria se aceleren,
¿no?), y además el sistema consumirá un tiempo adicional en lo que
llaman el "context switching" (cambio de contexto de ejecución para
pasar de un hilo a otro).

Razones por las cuales valdría la pena considerar los hilos:
a) si quieres que el programa vaya avanzando en las seis imágenes en
paralelo (por ejemplo, para irlas mostrando en seis ventanitas en la
medida en que se van generando). Aquí los hilos son sencillamente la
herramienta a utilizar.
b) si quieres que el usuario pueda ir haciendo otra cosa mientras se
generan las imágenes. En ese caso tendrías la opción de tener siete
hilos (el principal, que atiende a la intefaz de usuario, y uno para
cada una de las imágenes), o sólo dos hilos (el principal y otro que
genera las seis imágenes secuencialmente).

Slds - Octavio

"José Miguel Torres" escribió en el mensaje
news:086101c513a5$ee6d76d0$
Hola, tengo un problemita, tengo que ejecutar un proceso
que es algo pesado (3 o 4 segundos) varias veces, en un
siclo for(), como cada iteración esta tardando mucho,
pense en utilizar hilos, pero no conosco mucho de esto,
creen que si tengo que iterar 6 veces sobre un mismo
proceso y esperar 20 segundos por ejemplo, con 6 hilos
trabajando el tiempo de espera se verá reducido??? Y de
ser así como podría hacer para capturar la salida de cada
uno de los hilos? Cada hilo lo que hará será convertir un
array de bytes a una imagen jpg, entonces cada hilo deberá
recibir el array y devolverme la imagen. Bueno mi consulta
es si vale la pena investigar esto de los hilos para
obtener las salidas más rápido o si alfinal y al cabo será
lo mismo. Muchas gracias.









Respuesta Responder a este mensaje
#8 Octavio Hernandez
17/02/2005 - 00:07 | Informe spam
Yo sigo diciendo que en este caso la E/S es muy importante claro que para
eso lo que habría que hacer es lanzar N hilos (uno por cada imagen) y
luego tener otro hilo que es el encargado de escribir las imágenes, podría
recibir 1 mensaje de cada uno de los otros hilos con la imagen ya
codificada y de ese modo podría serializar la E/S



Muy buena idea, me dan ganas de empezar a programar algo sobre esto...

Salu2 - Octavio
Respuesta Responder a este mensaje
#9 Kravek
17/02/2005 - 01:46 | Informe spam
Es lo que tiene tener un examen de concurrencia en unas horas... aunque en
este caso el lenguaje será JAVA


"Octavio Hernandez" escribió en el mensaje
news:
Yo sigo diciendo que en este caso la E/S es muy importante claro que para
eso lo que habría que hacer es lanzar N hilos (uno por cada imagen) y
luego tener otro hilo que es el encargado de escribir las imágenes,
podría recibir 1 mensaje de cada uno de los otros hilos con la imagen ya
codificada y de ese modo podría serializar la E/S



Muy buena idea, me dan ganas de empezar a programar algo sobre esto...

Salu2 - Octavio


Respuesta Responder a este mensaje
#10 Octavio Hernandez
17/02/2005 - 20:50 | Informe spam
Pues se te ve bien preparado :-)
Me imagino que uno de los libros recomendados será el de Doug Lea, ¿no? Buen
libro ese...

Slds - Octavio

"Kravek" <rubengARROBAkailea4.net> escribió en el mensaje
news:%
Es lo que tiene tener un examen de concurrencia en unas horas... aunque en
este caso el lenguaje será JAVA


"Octavio Hernandez" escribió en el mensaje
news:
Yo sigo diciendo que en este caso la E/S es muy importante claro que
para eso lo que habría que hacer es lanzar N hilos (uno por cada imagen)
y luego tener otro hilo que es el encargado de escribir las imágenes,
podría recibir 1 mensaje de cada uno de los otros hilos con la imagen ya
codificada y de ese modo podría serializar la E/S



Muy buena idea, me dan ganas de empezar a programar algo sobre esto...

Salu2 - Octavio






Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida