Sobes.tech
Middle

Quelles méthodes de communication entre processus connais-tu?

sobes.tech IA

Réponse de l'IA

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

    // Exemple d'utilisation d'un canal pour la communication entre goroutines
    ch := make(chan int)
    go func() {
        ch <- 1 // envoi de valeur
    }()
    value := <-ch // réception de valeur
    
  • Mutex et opérations atomiques : Pour protéger les données partagées lors de l'accès depuis plusieurs processus.

    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)
    }
    
  • Mémoire partagée : Son utilisation directe peut être complexe à gérer et sujette à des conditions de course. Elle est généralement implémentée via d'autres mécanismes (par exemple, mappage de fichiers en mémoire).

  • Interactions réseau (TCP/UDP) : Méthode classique de communication interprocessus, surtout pour les systèmes distribués. Go offre de riches fonctionnalités pour le travail réseau.

    // Côté serveur :
    /*
       listener, _ := net.Listen("tcp", ":8080")
       conn, _ := listener.Accept()
       // lecture/écriture via conn
    */
    
    // Côté client :
    /*
       conn, _ := net.Dial("tcp", "localhost:8080")
       // lecture/écriture via conn
    */
    
  • Mécanismes IPC du système d'exploitation :

    • Sockets Unix domain : Méthode efficace pour la communication entre processus sur une même machine.
    • Canaux nommés (Pipes) : Pour communication unidirectionnelle ou bidirectionnelle.
    • Signaux : Pour notifications asynchrones entre processus.
  • Fichiers : Les processus peuvent échanger des données en écrivant et en lisant dans des fichiers partagés. Il faut utiliser des verrouillages pour éviter les conditions de course.

  • Bases de données et brokers de messages : Pour des scénarios plus complexes, communication asynchrone et fiabilité. Exemples : Kafka, RabbitMQ, Redis (pub/sub), PostgreSQL.