CursosEmpresasBlogLiveConfPrecios

Creación de hilos con Rust

Clase 7 de 12 • Curso de Gestión de Servidores con Rust

Contenido del curso

Introducción

  • 1

    Qué aprenderemos

    01:39 min
  • 2

    Ambiente de trabajo

    01:03 min

Protocolos TCP y HTTP

  • 3

    Conexión TCP

    03:24 min
  • 4

    Conexión HTTP

    02:38 min
  • 5

    Validación de la respuesta en el servidor

    02:11 min

Concurrencia

  • 6

    Uso de concurrencia en Rust

    01:34 min
  • 7

    Creación de hilos con Rust

    Viendo ahora
  • 8

    Traits, Metodos y Mutex para concurrencia

    03:21 min

Creación de un Servidor web multiprocesos

  • 9

    Mejora de nuestro servidor web con multitareas: ThreadPool

    02:46 min
  • 10

    Configurando nuestro Threadpool

    03:12 min

Limpieza del servidor

  • 11

    Uso de Drop

    01:18 min

Hacerlo de la manera fácil

  • 12

    Uso de frameworks y crates

    02:02 min
Tomar examen

Escuelas

  • Desarrollo Web
    • Fundamentos del Desarrollo Web Profesional
    • Diseño y Desarrollo Frontend
    • Desarrollo Frontend con JavaScript
    • Desarrollo Frontend con Vue.js
    • Desarrollo Frontend con Angular
    • Desarrollo Frontend con React.js
    • Desarrollo Backend con Node.js
    • Desarrollo Backend con Python
    • Desarrollo Backend con Java
    • Desarrollo Backend con PHP
    • Desarrollo Backend con Ruby
    • Bases de Datos para Web
    • Seguridad Web & API
    • Testing Automatizado y QA para Web
    • Arquitecturas Web Modernas y Escalabilidad
    • DevOps y Cloud para Desarrolladores Web
  • English Academy
    • Inglés Básico A1
    • Inglés Básico A2
    • Inglés Intermedio B1
    • Inglés Intermedio Alto B2
    • Inglés Avanzado C1
    • Inglés para Propósitos Específicos
    • Inglés de Negocios
  • Marketing Digital
    • Fundamentos de Marketing Digital
    • Marketing de Contenidos y Redacción Persuasiva
    • SEO y Posicionamiento Web
    • Social Media Marketing y Community Management
    • Publicidad Digital y Paid Media
    • Analítica Digital y Optimización (CRO)
    • Estrategia de Marketing y Growth
    • Marketing de Marca y Comunicación Estratégica
    • Marketing para E-commerce
    • Marketing B2B
    • Inteligencia Artificial Aplicada al Marketing
    • Automatización del Marketing
    • Marca Personal y Marketing Freelance
    • Ventas y Experiencia del Cliente
    • Creación de Contenido para Redes Sociales
  • Inteligencia Artificial y Data Science
    • Fundamentos de Data Science y AI
    • Análisis y Visualización de Datos
    • Machine Learning y Deep Learning
    • Data Engineer
    • Inteligencia Artificial para la Productividad
    • Desarrollo de Aplicaciones con IA
    • AI Software Engineer
  • Ciberseguridad
    • Fundamentos de Ciberseguridad
    • Hacking Ético y Pentesting (Red Team)
    • Análisis de Malware e Ingeniería Forense
    • Seguridad Defensiva y Cumplimiento (Blue Team)
    • Ciberseguridad Estratégica
  • Liderazgo y Habilidades Blandas
    • Fundamentos de Habilidades Profesionales
    • Liderazgo y Gestión de Equipos
    • Comunicación Avanzada y Oratoria
    • Negociación y Resolución de Conflictos
    • Inteligencia Emocional y Autogestión
    • Productividad y Herramientas Digitales
    • Gestión de Proyectos y Metodologías Ágiles
    • Desarrollo de Carrera y Marca Personal
    • Diversidad, Inclusión y Entorno Laboral Saludable
    • Filosofía y Estrategia para Líderes
  • Diseño de Producto y UX
    • Fundamentos de Diseño UX/UI
    • Investigación de Usuarios (UX Research)
    • Arquitectura de Información y Usabilidad
    • Diseño de Interfaces y Prototipado (UI Design)
    • Sistemas de Diseño y DesignOps
    • Redacción UX (UX Writing)
    • Creatividad e Innovación en Diseño
    • Diseño Accesible e Inclusivo
    • Diseño Asistido por Inteligencia Artificial
    • Gestión de Producto y Liderazgo en Diseño
    • Diseño de Interacciones Emergentes (VUI/VR)
    • Desarrollo Web para Diseñadores
    • Diseño y Prototipado No-Code
  • Contenido Audiovisual
    • Fundamentos de Producción Audiovisual
    • Producción de Video para Plataformas Digitales
    • Producción de Audio y Podcast
    • Fotografía y Diseño Gráfico para Contenido Digital
    • Motion Graphics y Animación
    • Contenido Interactivo y Realidad Aumentada
    • Estrategia, Marketing y Monetización de Contenidos
  • Desarrollo Móvil
    • Fundamentos de Desarrollo Móvil
    • Desarrollo Nativo Android con Kotlin
    • Desarrollo Nativo iOS con Swift
    • Desarrollo Multiplataforma con React Native
    • Desarrollo Multiplataforma con Flutter
    • Arquitectura y Patrones de Diseño Móvil
    • Integración de APIs y Persistencia Móvil
    • Testing y Despliegue en Móvil
    • Diseño UX/UI para Móviles
  • Diseño Gráfico y Arte Digital
    • Fundamentos del Diseño Gráfico y Digital
    • Diseño de Identidad Visual y Branding
    • Ilustración Digital y Arte Conceptual
    • Diseño Editorial y de Empaques
    • Motion Graphics y Animación 3D
    • Diseño Gráfico Asistido por Inteligencia Artificial
    • Creatividad e Innovación en Diseño
  • Programación
    • Fundamentos de Programación e Ingeniería de Software
    • Herramientas de IA para el trabajo
    • Matemáticas para Programación
    • Programación con Python
    • Programación con JavaScript
    • Programación con TypeScript
    • Programación Orientada a Objetos con Java
    • Desarrollo con C# y .NET
    • Programación con PHP
    • Programación con Go y Rust
    • Programación Móvil con Swift y Kotlin
    • Programación con C y C++
    • Administración Básica de Servidores Linux
  • Negocios
    • Fundamentos de Negocios y Emprendimiento
    • Estrategia y Crecimiento Empresarial
    • Finanzas Personales y Corporativas
    • Inversión en Mercados Financieros
    • Ventas, CRM y Experiencia del Cliente
    • Operaciones, Logística y E-commerce
    • Gestión de Proyectos y Metodologías Ágiles
    • Aspectos Legales y Cumplimiento
    • Habilidades Directivas y Crecimiento Profesional
    • Diversidad e Inclusión en el Entorno Laboral
    • Herramientas Digitales y Automatización para Negocios
  • Blockchain y Web3
    • Fundamentos de Blockchain y Web3
    • Desarrollo de Smart Contracts y dApps
    • Finanzas Descentralizadas (DeFi)
    • NFTs y Economía de Creadores
    • Seguridad Blockchain
    • Ecosistemas Blockchain Alternativos (No-EVM)
    • Producto, Marketing y Legal en Web3
  • Recursos Humanos
    • Fundamentos y Cultura Organizacional en RRHH
    • Atracción y Selección de Talento
    • Cultura y Employee Experience
    • Gestión y Desarrollo de Talento
    • Desarrollo y Evaluación de Liderazgo
    • Diversidad, Equidad e Inclusión
    • AI y Automatización en Recursos Humanos
    • Tecnología y Automatización en RRHH
  • Finanzas e Inversiones
    • Fundamentos de Finanzas Personales y Corporativas
    • Análisis y Valoración Financiera
    • Inversión y Mercados de Capitales
    • Finanzas Descentralizadas (DeFi) y Criptoactivos
    • Finanzas y Estrategia para Startups
    • Inteligencia Artificial Aplicada a Finanzas
    • Domina Excel
    • Financial Analyst
    • Conseguir trabajo en Finanzas e Inversiones
  • Startups
    • Fundamentos y Validación de Ideas
    • Estrategia de Negocio y Product-Market Fit
    • Desarrollo de Producto y Operaciones Lean
    • Finanzas, Legal y Fundraising
    • Marketing, Ventas y Growth para Startups
    • Cultura, Talento y Liderazgo
    • Finanzas y Operaciones en Ecommerce
    • Startups Web3 y Blockchain
    • Startups con Impacto Social
    • Expansión y Ecosistema Startup
  • Cloud Computing y DevOps
    • Fundamentos de Cloud y DevOps
    • Administración de Servidores Linux
    • Contenerización y Orquestación
    • Infraestructura como Código (IaC) y CI/CD
    • Amazon Web Services
    • Microsoft Azure
    • Serverless y Observabilidad
    • Certificaciones Cloud (Preparación)
    • Plataforma Cloud GCP

Platzi y comunidad

  • Platzi Business
  • Live Classes
  • Lanzamientos
  • Executive Program
  • Trabaja con nosotros
  • Podcast

Recursos

  • Manual de Marca

Soporte

  • Preguntas Frecuentes
  • Contáctanos

Legal

  • Términos y Condiciones
  • Privacidad
  • Tyc promociones
Reconocimientos
Reconocimientos
Logo reconocimientoTop 40 Mejores EdTech del mundo · 2024
Logo reconocimientoPrimera Startup Latina admitida en YC · 2014
Logo reconocimientoPrimera Startup EdTech · 2018
Logo reconocimientoCEO Ganador Medalla por la Educación T4 & HP · 2024
Logo reconocimientoCEO Mejor Emprendedor del año · 2024
De LATAM conpara el mundo
YoutubeInstagramLinkedInTikTokFacebookX (Twitter)Threads

      En la clase anterior vimos cómo se maneja la concurrencia en Rust, abordamos que para mejor manejo de errores es dividir el código en multiprocesos o hilos. En esta clase veremos cómo podemos crear hilos, moverlos y la comunicación entre ellos.

      NOTA: En cada segmento de código, si hay una palabra que diga Ejecutar podrás darle clic e ir directamente a Rust Playground para que puedas probar el código.

      Creando un hilo (thread)


      Para comenzar a crear un hilo, comenzaremos nuestro código invocando el módulo std::thread, nos permitirá usar todos sus métodos y funciones que nos facilitan la creación de hilos, veamos un ejemplo.

      use std::thread; fn main() { let example = thread::spawn(move || { println!("Hola desde tu primer hilo"); }); let _ = example.join(); }

      Ejecutar

      Este ejemplo lo habrás visto en temas más básicos de Rust, pero expliquemos un poco de qué es lo que está pasando.

      Primero creamos una variable llamada example donde nos permite traer la función thread::spawn. Spawn es una función genérica con un argumento y dos parámetros de tipo:

      fn spawn<F, T>(f: F) -> JoinHandle<T>
      1. El tipo F puede ser cualquier función / cierre que devuelva un T ( FnOnce() -> T), se puede transferir de forma segura entre subprocesos ( Send) y no contiene referencias de corta duración ( 'static),
      2. El tipo T puede ser de cualquier tipo, siempre que se pueda transferir entre subprocesos y no contenga referencias de corta duración.

      El JoinHandle<T> permite recuperar el T que f regresa, a través de su método join.

      El move es un cierre de hilos que a menudo se usa junto a thread::spawn porque le permite usar datos de un hilo en otro hilo.

      También puedes agregar:

      thread::sleep_ms(1000);

      Las llamadas thread::sleep obligan a un subproceso a detener su ejecución durante un período breve, lo que permite que se ejecute un subproceso diferente. Los subprocesos probablemente se turnen, pero eso no está garantizado: depende de cómo su sistema operativo programe los subprocesos.

      Veamos un segundo caso:

      use std::thread; use std::time::Duration; fn main() { let handle = thread::spawn(|| { for i in 1..10 { println!("hola {} desde el primer hilo", i); thread::sleep(Duration::from_millis(1)); } }); handle.join().unwrap(); for i in 1..5 { println!("hola {} desde el segundo hilo", i); thread::sleep(Duration::from_millis(1)); } for i in 1..4 { println!("hola {} desde el tercer hilo", i); thread::sleep(Duration::from_millis(1)); } }

      Ejecutar

      El ejemplo imprime un texto de un hilo principal y otro texto de un hilo nuevo. Ten en cuenta que con esta función, el nuevo subproceso se detendrá cuando finalice el subproceso principal, haya terminado o no de ejecutarse. El resultado de este programa puede ser un poco diferente cada vez.

      En este segundo caso agregamos el método Duration qué es un tipo de duración para representar un lapso de tiempo, generalmente utilizado para tiempos de espera del sistema.

      Hasta aquí, hemos visto lo básico de crear hilos con Rust. Ahora inténtalo, crea diferentes tipos de hilos, usa thread::sleep para que se detenga cierto tiempo y se ejecute el siguiente hilo, muestra tus resultados en los comentarios.

        Osvaldo Frias

        Osvaldo Frias

        student•
        hace 5 años

        Genial :D

        Hice un ligero cambio para que los hilos se ejecutaran de forma diferente al ejemplo original :P

        Screenshot_3.png
        Screenshot_4.png
          Leonardo Rodrigues

          Leonardo Rodrigues

          student•
          hace 5 años

          Genial, viendo el codigo dentro del contenido me parecia que los 2 ultimos "for" realmente no corrian realmene en otro theard. Con el tuyo, vero que si lo hacen.

        Sebastian Londoño

        Sebastian Londoño

        student•
        hace 5 años

        Unos datos adicionales: la razón del

        handle.join().unwrap();

        cuando es llamado, va a esperar a que los hilos acaben. si cambian de lugar esa linea después de los 2 fors de los hilos, verán como muestra los datos en un aparente desorden. La documentación de Rust en hilos también permite correr el código desde la web de ellos

        Osvaldo Frias

        Osvaldo Frias

        student•
        hace 5 años

        Hice una implementación del servidor con hilos, dejo mi código por si alguien quiere verlo y comentar al respecto.

        Carolina Fernandez

        Carolina Fernandez

        student•
        hace 5 años

        La creación de hilos, ¿podríamos decir que es algo así a un equivalente al async/await de JS? no acabo de entenderlo del todo, en el ejemplo independientemente del tiempo de Duration que tenga cualquiera de los hilos, siempre se me ejecutan en el mismo orden, por lo que asumo que hasta que no acaba el primero, no se estarían ejecutando los demás ¿verdad?.

          Angel Fernando Quiroz Campos

          Angel Fernando Quiroz Campos

          student•
          hace 5 años

          No. JavaScript no es multi-hilo (puedes revisar esta clase del curso de js https://platzi.com/clases/1642-javascript-profesional/22169-event-loop/)

          Los Threads permiten que tú como programador puedas ejecutar simultáneamente dos (o más) partes de tu código código. Puedes revisar la documentación oficial aquí https://doc.rust-lang.org/book/ch16-01-threads.html

          Carolina Fernandez

          Carolina Fernandez

          student•
          hace 5 años

          Gracias @AngelFQC , con lo de JavaScript me refería a que si era tipo asíncrono como una pila que cuando acabase a uno, se realizaba entonces el otro y así, pero ya he visto que no, que es ejecutar de forma simultánea a la vez.

        Roberto Antonio Berrospe Machin

        Roberto Antonio Berrospe Machin

        student•
        hace 5 años

        Cómo dice la profesora: "Los subprocesos probablemente se turnen, pero eso no está garantizado: depende de cómo su sistema operativo programe los subprocesos."

        use std::thread; fn main() { let hilo1 = thread::spawn(|| { for i in 1..10 { println!("Hilo 1: {}", i); } }); let hilo2 = thread::spawn(|| { for i in 1..10 { println!("Hilo 2: {}", i); } }); let hilo3 = thread::spawn(|| { for i in 1..10 { println!("Hilo 3: {}", i); } }); let hilo4 = thread::spawn(|| { for i in 1..10 { println!("Hilo 4: {}", i); } }); hilo1.join().unwrap(); hilo2.join().unwrap(); hilo3.join().unwrap(); hilo4.join().unwrap(); }

        Resultado de cargo run:

        Finished dev [unoptimized + debuginfo] target(s) in 0.83s Running `target/debug/hilos` Hilo 1: 1 Hilo 1: 2 Hilo 1: 3 Hilo 1: 4 Hilo 1: 5 Hilo 1: 6 Hilo 2: 1 Hilo 3: 1 Hilo 1: 7 Hilo 1: 8 Hilo 2: 2 Hilo 2: 3 Hilo 4: 1 Hilo 4: 2 Hilo 4: 3 Hilo 4: 4 Hilo 1: 9 Hilo 3: 2 Hilo 3: 3 Hilo 3: 4 Hilo 3: 5 Hilo 3: 6 Hilo 3: 7 Hilo 3: 8 Hilo 3: 9 Hilo 4: 5 Hilo 4: 6 Hilo 4: 7 Hilo 4: 8 Hilo 4: 9 Hilo 2: 4 Hilo 2: 5 Hilo 2: 6 Hilo 2: 7 Hilo 2: 8 Hilo 2: 9
        Gerardo Alberto Soto Alvarez del Castillo

        Gerardo Alberto Soto Alvarez del Castillo

        student•
        hace 5 años

        La instrucción:

        variable.join().unwrap();

        Lo que hace es juntar todos los threads (hilos) creados por la variable y (los junta) para no avanzar a la siguiente instrucción o terminar el programa hasta que todos los threads hallan terminado su ejecución.

        Gerardo Alberto Soto Alvarez del Castillo

        Gerardo Alberto Soto Alvarez del Castillo

        student•
        hace 5 años

        Waiting for All Threads to Finish Using join Handles The code in Listing 16-1 not only stops the spawned thread prematurely most of the time due to the main thread ending, but also can’t guarantee that the spawned thread will get to run at all. The reason is that there is no guarantee on the order in which threads run! We can fix the problem of the spawned thread not getting to run, or not getting to run completely, by saving the return value of thread::spawn in a variable. The return type of thread::spawn is JoinHandle. A JoinHandle is an owned value that, when we call the join method on it, will wait for its thread to finish.

        (Esperar a que todos los hilos terminen usando join Handles El código del Listado 16-1 no sólo detiene el hilo generado prematuramente la mayoría de las veces debido a la finalización del hilo principal, sino que tampoco puede garantizar que el hilo generado llegue a ejecutarse. La razón es que no se garantiza el orden de ejecución de los hilos. Podemos solucionar el problema de que el hilo generado no se ejecute, o no se ejecute completamente, guardando el valor de retorno de thread::spawn en una variable. El tipo de retorno de thread::spawn es JoinHandle. Un JoinHandle es un valor propio que, cuando llamamos al método join sobre él, esperará a que su hilo termine.)

        Fuente: https://doc.rust-lang.org/book/ch16-01-threads.html?highlight=thread#waiting-for-all-threads-to-finish-using-join-handles

        Gerardo Alberto Soto Alvarez del Castillo

        Gerardo Alberto Soto Alvarez del Castillo

        student•
        hace 5 años

        In most current operating systems, an executed program’s code is run in a process, and the operating system manages multiple processes at once. Within your program, you can also have independent parts that run simultaneously. The features that run these independent parts are called threads.

        (En la mayoría de los sistemas operativos actuales, el código de un programa se ejecuta en un proceso, y el sistema operativo gestiona varios procesos a la vez. Dentro de su programa, también puede tener partes independientes que se ejecutan simultáneamente. Las funciones que ejecutan estas partes independientes se llaman hilos.) Ejemplo de un Thread:

        use std::thread; use std::time::Duration; fn main() { thread::spawn(|| { for i in 1..10 { println!("hi number {} from the spawned thread!", i); thread::sleep(Duration::from_millis(1)); } }); for i in 1..5 { println!("hi number {} from the main thread!", i); thread::sleep(Duration::from_millis(1)); } }

        Output: hi number 1 from the MAIN thread! Hi number 1 from the spawned thread! hi number 2 from the MAIN thread! Hi number 2 from the spawned thread! hi number 3 from the MAIN thread! Hi number 3 from the spawned thread! hi number 4 from the MAIN thread! Hi number 4 from the spawned thread!

        El programa termina hasta que el thread principal (MAIN) termina sin esperar a los otros procesos (Ya que no tiene un handle asignado).