Sobes.tech
Middle

¿Qué formas de comunicación entre procesos conoces?

sobes.tech AI

Respuesta de la IA

  • Canales: La forma idiomática principal en Go. Concurrencias tipadas para transmitir valores entre goroutines o procesos (al usar medios externos, como sockets Unix).

    // Ejemplo de uso de un canal para comunicación entre goroutines
    ch := make(chan int)
    go func() {
        ch <- 1 // envío de valor
    }()
    value := <-ch // recepción de valor
    
  • Mutex y operaciones atómicas: Para proteger datos compartidos en acceso desde múltiples procesos.

    import (
        "sync"
        "sync/atomic"
    )
    
    var mu sync.Mutex
    var counter int
    
    func incrementWithMutex() {
        mu.Lock()
        counter++
        mu.Unlock()
    }
    
    var atomicCounter int32
    
    func incrementWithAtomic() {
        atomic.AddInt32(&atomicCounter, 1)
    }
    
  • Memoria compartida: Su uso directo puede ser complejo de gestionar y propenso a condiciones de carrera. Normalmente se implementa mediante otros mecanismos (por ejemplo, mapeo de archivos en memoria).

  • Interacciones de red (TCP/UDP): Método clásico de comunicación entre procesos, especialmente en sistemas distribuidos. Go ofrece amplias capacidades para trabajar con redes.

    // En el lado del servidor:
    /*
       listener, _ := net.Listen("tcp", ":8080")
       conn, _ := listener.Accept()
       // lectura/escritura de datos a través de conn
    */
    
    // En el lado del cliente:
    /*
       conn, _ := net.Dial("tcp", "localhost:8080")
       // lectura/escritura de datos a través de conn
    */
    
  • Mecanismos IPC del SO:

    • Sockets de dominio Unix: Forma eficiente de comunicación entre procesos en una misma máquina.
    • Canales con nombre (Pipes): Para comunicación unidireccional o bidireccional.
    • Señales: Para notificaciones asíncronas entre procesos.
  • Archivos: Los procesos pueden intercambiar datos escribiendo y leyendo en archivos compartidos. Es necesario usar bloqueos para evitar condiciones de carrera.

  • Bases de datos y brokers de mensajes: Para escenarios más complejos, comunicación asíncrona y garantizar fiabilidad. Ejemplos: Kafka, RabbitMQ, Redis (pub/sub), PostgreSQL.