Sobes.tech
Middle

Aké spôsoby komunikácie medzi procesmi poznáš?

sobes.tech AI

Odpoveď od AI

  • Kanály: Hlavný idiomatický spôsob v Go. Typované konkurencie na prenos hodnôt medzi gorutinami alebo procesmi (pri použití externých prostriedkov, napríklad unixových soketov).

    // Príklad použitia kanála na komunikáciu medzi gorutinami
    ch := make(chan int)
    go func() {
        ch <- 1 // odoslanie hodnoty
    }()
    value := <-ch // prijatie hodnoty
    
  • Mutexy a atomické operácie: Na ochranu zdieľaných dát pri prístupe z viacerých procesov.

    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)
    }
    
  • Zdieľaná pamäť: Priame používanie môže byť ťažké na správu a náchylné na podmienky súboja. Zvyčajne sa realizuje cez iné mechanizmy (napríklad mapovanie súborov do pamäte).

  • Sieťové interakcie (TCP/UDP): Klasický spôsob medziprocesovej komunikácie, najmä pre distribuované systémy. Go ponúka bohaté možnosti práce so sieťou.

    // Na strane servera:
    /*
       listener, _ := net.Listen("tcp", ":8080")
       conn, _ := listener.Accept()
       // čítanie/zapisovanie dát cez conn
    */
    
    // Na strane klienta:
    /*
       conn, _ := net.Dial("tcp", "localhost:8080")
       // čítanie/zapisovanie dát cez conn
    */
    
  • Mechanizmy IPC operačného systému:

    • Unixové doménové sokety: Efektívny spôsob komunikácie medzi procesmi na rovnakom stroji.
    • Názvové kanály (Pipes): Pre jednosmernú alebo obojsmernú komunikáciu.
    • Signály: Pre asynchrónne oznámenia medzi procesmi.
  • Súbory: Procesy môžu vymieňať dáta zapisovaním a čítaním zo zdieľaných súborov. Je potrebné používať zámky na zabránenie podmienok súboja.

  • Databázy a brokeri správ: Pre zložitejšie scenáre, asynchrónnu komunikáciu a zabezpečenie spoľahlivosti. Príklady: Kafka, RabbitMQ, Redis (pub/sub), PostgreSQL.