ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • golang: 동시성에서 제한(Confinement)이란?
    Back-End/Golang 2024. 4. 19. 09:50
    반응형

    "동시성 코드로 작업할 때, 안전한 작동을 위한 몇 가지 옵션이 있다."

    • 메모리 공유를 위한 동기화 기본 요소(예: sync.Mutex)
    • 통신을 통한 동기화(예: 채널)
    • 변경 불가능한 데이터
    • 제한(Confinement)에 의해 보호되는 데이터

     제한(Confinement)은 동시성 프로그래밍에서 데이터 접근을 제어하여, 고루틴 간의 간섭이나 경쟁 상태를 방지하는 기법입니다. 데이터를 고루틴이나 특정 코드 영역에 "제한"함으로써 안전하게 데이터를 공유할 수 있습니다.

    언제 사용하나요?

     제한은 특히 여러 고루틴이 동시에 실행되는 환경에서 중요합니다. 데이터를 여러 고루틴이 공유할 때 발생할 수 있는 문제(예: 경쟁 상태, 데드락)를 방지하기 위해 사용됩니다. 제한을 통해 각 고루틴이 데이터의 접근을 독립적으로 관리할 수 있도록 하여 프로그램의 안정성과 예측 가능성을 높입니다.

    제한의 방식

    1. 애드혹 제한 (Ad hoc Confinement) 애드혹 제한은 데이터를 직접적으로 특정 코드 블록이나 고루틴에 의존하여 제한하는 방식입니다. 개발자가 데이터 접근을 명시적으로 제어하여 특정 고루틴이나 함수 내에서만 데이터를 사용하도록 합니다.

    2. 어휘적 제한 (Lexical Confinement) 어휘적 제한은 변수를 그 변수가 선언된 코드 블록 내에서만 사용하는 것을 말합니다. 데이터는 해당 코드 블록을 벗어나지 않으므로 다른 고루틴이나 코드 블록에서 접근할 수 없습니다. 이 방식은 프로그램의 구조를 통해 자연스럽게 데이터 접근을 제한합니다.

    제한의 예시

    애드혹 제한 예시 코드:

    package main
    
    import (
        "fmt"
        "sync"
    )
    
    func main() {
        var wg sync.WaitGroup
        confineData := "이 데이터는 이 고루틴에 제한됩니다."
    
        wg.Add(1)
        go func(data string) {
            defer wg.Done()
            fmt.Println(data)
        }(confineData)
    
        wg.Wait()
    }

     이 예시에서 confineData라는 문자열은 메인 고루틴에서 생성되어 별도의 고루틴으로 전달됩니다. 이 문자열은 매개변수를 통해 고루틴에 전달되며, 이는 다른 곳에서 사용되지 않아 고루틴 내에서만 접근이 가능합니다. 이 방식은 데이터가 고루틴의 실행 흐름을 따라 이동하고, 메인 고루틴과는 독립적으로 관리되기 때문에 애드혹 제한의 좋은 예시입니다. 애드혹 제한을 사용하면 개발자가 데이터의 사용 범위를 명확하게 제어할 수 있으며, 데이터를 필요한 컨텍스트에만 제한함으로써 안전성을 높일 수 있습니다.

     

     

    어휘적 제한 예시 코드:

    package main
    
    import (
        "fmt"
        "sync"
    )
    
    func main() {
        var wg sync.WaitGroup
        wg.Add(1)
        go func() {
            defer wg.Done()
            insideData := "이 데이터는 고루틴 내에서만 사용되어 제한됩니다."
            fmt.Println(insideData)
        }()
    
        wg.Wait()
    }

     이 예시에서 insideData는 고루틴 내부에서 선언되고 사용됩니다. 이 변수는 그 고루틴의 어휘적 범위 내에서만 존재하며, 고루틴 외부에서는 접근할 수 없습니다. 어휘적 제한은 코드의 구조적 범위를 이용하여 데이터 접근을 자동으로 제한합니다. 이 방법은 변수가 선언된 위치에 따라 접근성이 결정되므로, 데이터가 불필요하게 외부에 노출되는 것을 방지할 수 있습니다. 특히, 고루틴이나 함수 내부에서만 필요한 데이터에 대해 강력한 제한을 제공하여, 데이터의 안전한 사용을 보장합니다.

     

    두 방식의 비교

     애드혹 제한과 어휘적 제한은 모두 유용하지만, 사용 상황에 따라 선택이 달라질 수 있습니다. 애드혹 제한은 더 유연하며 개발자가 데이터의 흐름을 명시적으로 제어할 수 있습니다. 반면, 어휘적 제한은 코드의 구조적인 제약을 통해 자동으로 데이터의 접근을 제한하므로, 실수로 데이터를 노출시킬 위험이 적습니다. 그러나 이는 프로그램의 구조에 따라 제약이 생길 수 있습니다.

     

     

    반응형

    'Back-End > Golang' 카테고리의 다른 글

    golang: 문자열 함수  (0) 2024.04.21
    golang: for-select 패턴  (0) 2024.04.19
    golang: 포인터(Pointer)란?  (0) 2024.03.30
    golang: 컨텍스트(Context)란?  (0) 2024.03.30
    golang: 채널(Channel)이란?  (0) 2024.03.30
Designed by Tistory.