entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

3votos

¿Como funciona la función "join" que es comun en varios lenguajes?

Hola a todos!
Tengo una duda existencial con esa función. En los lenguajes que manejan hilos o threads existe la función "join". Se que sirve para que un hilo al crear otro hilo, este último no termine antes. Pero mi duda es: cuando es invocada esta función ¿se comporta igual que la función "accept" utilizada para sockets?, es decir, que las instrucciones que estan más abajo en el codigo no pueden ejecutarse hasta que esta termine. ¿Es igual en todos los lenguajes?

Si les interesa saber: Lo que quiero es programar una biblioteca para programar servidores HTTP de manera sencilla, que soporte Server Sent Events, REST, que en vez de usar un hilo por cada petición use una determinada cantidad de ellos y se reparta el trabajo entre ellos, y cualquier otra cosa que se me ocurra. El lenguaje que quiero usar es Rust, que es el que creó Mozilla. Ya probe crear un servidor HTTP que no usa hilos, es muy sencillo y funciona, incluso lo probé con el navegador, pero sin hilos es inutilizable.

Saludos!

2 Respuestas

0voto

pedrourday Puntos3330

Sinceramente, ahora que veo los comentarios, creo que intentar hacer mi propia implementación de un servidor HTTP puede hacerce muy complicado. No quiero complicarme tanto, voy a intentar con NodeJS y Express.

Gracias de todos modos! Saludos cordiales!

2votos

Leonardo-Tadei Puntos227320

Mmmm... mezclar los conceptos de threads y sockets no te va a llevar a nada bueno, sobre todo porque no tiene sentido la existencia de un socket multihilo!

Otra cosa es tener varios threads/procs y que cado uno cree y maneje un socket, pero ahí da lo mismo que manejes sockets o sumas o querys a una DB.

Además, del lado del servidor, tenés que tener procesos escuchando peticiones y poco más: el problema es del lado del cliente, en el que sí puede ser que valga la pena paralelizar las consultas: una página que tiene 3 imágenes, implica que el cliente haga 4 peticiones HTTP, y son estas peticiones las que podrían ser concurrentes. El servidor meramente creará un nuevo socket para cada respuesta y no le importa nada cual termina primero y cuál termina después...

No sé, tal vez no esté entendiendo cuál es el problema o qué estás queriendo implementar puntualmente, pero ni el SSE requiere que se coordinen diferentes sockets.

Saludos cordiales!

1voto

pedrourday comentado

La pregunta la respondí por mi mismo. La hice porque no entendia la documentación que habia en Internet y si alguien lo sabia mejor. Mi pregunta era si la función "join", al igual que la función "accept", es sincronica (es era la palabra que buscaba). Yo tenia la idea de que era asincronica, pero pude comprobar que no lo era. Simplemente hice un programa de ejemplo en C# para comprobarlo:

using System;
using System.Threading;

namespace ThreadsTest {
    class Program {
        private void asyncFn(object n) {
            Console.WriteLine("Ejecutando el hilo " + n);
            Thread.Sleep(5000);
        }

        public Program() {
            Thread t1 = new Thread(asyncFn);
            t1.Start(1);
            t1.Join();
            Thread t2 = new Thread(asyncFn);
            t2.Start(2);
            t2.Join();
            Thread t3 = new Thread(asyncFn);
            t3.Start(3);
            t3.Join();
        }

        static void Main(string[] args) {
            new Program();
        }
    }
}

En los ejemplos que hay en Internet sobre como programar un servidor http, siempre aparece el ciclo infinito:

while(true)

Eso me parece horrible y no permite que en algun momento se pueda apagar el servidor sin matar el proceso. Mi solucion es usar variables como condición del while. Entonces a mi me queda:

while (isRunning && !stopNow)

Y ademas tengo que utilizar estructuras auxiliares, como una lista de hilos, etc.

Mi problema era encontrar una forma de que cuando se le indique al programa apagar el servidor, el programa no finalize abruptamente y el hilo principal espere a que todos los demas hilos terminaran su trabajo con un timeout de 30 segundos y para eso uso "join". Estuve programando algo en C# y logre hacerlo funcionar como yo quería, pero todavia no sirve archivos estaticos (HTML, CSS, Javascript), aunque eso es facil. Y con respecto al comportamiento de un hilo por cada peticion prefiero dejarlo así, luego lo modificaré si hace falta.

Eso es todo! Saludos cordiales!

1voto

Leonardo-Tadei comentado

Hola Pedro,

para implementar este tipo de apagado/cierre de un software, tenés que implementar señales para que los procesos hablen entre sí, y tener un proceso maestro que vaya creando hilos y sea capaz de cerrarlos (o en este caso de un servidor HTTP, que espere a que los procesos hijo terminen).

Esto es porque diferentes hilos no comparten el mismo espacio de memoria, lo que significa que lo que hace un hilo no puede ser modificado por otro: es el propio hilo el que, al recibir un mensaje/evento hace la tarea.

No es exactamente igual en la programación multihilo que en la multiproceso, pero en todos los casos hay mecanismos de aislación de memoria subyacentes y no es tan trivial que un proceso hable con otro.

Saludos cordiales!

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta