Sobes.tech
Middle

Jaké způsoby komunikace mezi procesy znáš?

sobes.tech AI

Odpověď od AI

  • Kanály: Hlavní idiomatický způsob v Go. Typovaná konkurence pro přenos hodnot mezi gorutinami nebo procesy (při použití externích prostředků, například unixových socketů).

    // Příklad použití kanálu pro komunikaci mezi gorutinami
    ch := make(chan int)
    go func() {
        ch <- 1 // odeslání hodnoty
    }()
    value := <-ch // přijetí hodnoty
    
  • Mutexy a atomické operace: Pro ochranu sdílených dat při přístupu z více procesů.

    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)
    }
    
  • Sdílená paměť: Přímé použití může být složité na správu a náchylné ke stavu závodu. Obvykle se realizuje přes jiné mechanismy (například mapování souborů do paměti).

  • Síťové interakce (TCP/UDP): Klasický způsob meziprocesové komunikace, zejména pro distribuované systémy. Go nabízí bohaté možnosti práce se sítí.

    // Na straně serveru:
    /*
       listener, _ := net.Listen("tcp", ":8080")
       conn, _ := listener.Accept()
       // čtení/zápis dat přes conn
    */
    
    // Na straně klienta:
    /*
       conn, _ := net.Dial("tcp", "localhost:8080")
       // čtení/zápis dat přes conn
    */
    
  • Mechanismy IPC operačního systému:

    • Unixové doménové sockety: Efektivní způsob komunikace mezi procesy na stejném stroji.
    • Pojmenované kanály (Pipes): Pro jednosměrnou nebo obousměrnou komunikaci.
    • Signály: Pro asynchronní oznámení mezi procesy.
  • Soubory: Procesy mohou sdílet data zapisováním a čtením ze sdílených souborů. Je nutné používat zámky, aby se zabránilo stavu závodu.

  • Databáze a brokeri zpráv: Pro složitější scénáře, asynchronní komunikaci a zajištění spolehlivosti. Příklady: Kafka, RabbitMQ, Redis (pub/sub), PostgreSQL.