상식닷컴
로그인
가입하기
2026년 상식닷컴 선정 식당 & 카페 리스트
2025년 2026년 신상 호텔 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요
일주일 식단표 어플
자동 일주일 식단표 어플
안드로이드
아이폰
주식 & 코인 차트의 신
1000만원으로 2000만원 만들기 프로젝트
궁금한 상식 보기
양육권을 가진 부모가 재혼하면 영향이 있나요?
양육권 없는 부모가 양육비를 안 내면 법적 제재가 있나요?
마그네슘 섭취가 많은 사람은 어떤 질병을 예방할 수 있나요?
마그네슘과 칼륨은 심장 건강에 어떤 상호작용이 있나요?
모기 방지: 여행 시 챙겨야 할 10가지 필수 아이템
위암 환자를 위한 10가지 건강한 음식
위암 진단 후, 알아야 할 5가지 사실
"혈관 건강을 위한 9가지 포커스"
독감 환자에게 필요한 4가지 수칙!
심리상담: 내 마음을 정리하는 5가지 비법
식욕을 빠르게 조절하는 4가지 스마트 팁
몸매관리, 8가지 잘못된 생각과 그 해결법
Previous
Next
수정하기 - Go에서 비동기 프로그래밍을 하는 방법은 무엇인가요?
닉네임
비밀번호
제목
내용
[이미지 업로드는 권한이 있는 사람만 가능. 하단 카톡으로 연락]
Go 언어는 비동기 프로그래밍을 지원하는 여러 가지 기능을 제공합니다. Go의 비동기 프로그래밍은 주로 <a href='https://sangseek.com/sangseeks/고루틴/ko'>고루틴</a>(goroutine)과 채널(channel)을 통해 이루어집니다. 이 두 가지는 Go의 동시성(concurrency) 모델의 핵심 요소로, 효율적이고 간단하게 비동기 작업을 수행할 수 있게 해줍니다. 1. 고루틴(Goroutines) 고루틴은 Go에서 경량 스레드로, `go` 키워드를 사용하여 함수를 비동기적으로 실행할 수 있습니다. 고루틴은 스택 메모리를 동적으로 할당하며, 수천 개의 고루틴을 동시에 실행할 수 있습니다. 고루틴은 다음과 같이 사용됩니다: ```go package main import ( "fmt" "time" ) func sayHello() { fmt.Println("Hello, World!") } func main() { go sayHello() // 고루틴으로 sayHello 함수 실행 time.Sleep(1 * time.Second) // 메인 함수가 종료되지 않도록 대기 } ``` 위의 예제에서 `sayHello` 함수는 고루틴으로 실행되며, 메인 함수는 1초 동안 대기하여 고루틴이 실행될 시간을 제공합니다. 2. 채널(Channels) 채널은 고루틴 간의 통신을 위한 메커니즘입니다. 채널을 사용하면 한 고루틴에서 다른 고루틴으로 데이터를 안전하게 전송할 수 있습니다. 채널은 다음과 같이 생성하고 사용할 수 있습니다: ```go package main import ( "fmt" ) func greet(ch chan string) { ch <- "Hello from goroutine!" // 채널을 통해 메시지 전송 } func main() { ch := make(chan string) // 문자열을 전송할 채널 생성 go greet(ch) // 고루틴으로 greet 함수 실행 message := <-ch // 채널에서 메시지 수신 fmt.Println(message) // 수신한 메시지 출력 } ``` 위의 예제에서 `greet` 함수는 채널을 통해 메시지를 전송하고, 메인 함수는 채널에서 메시지를 수신하여 출력합니다. 3. 선택문(Select) `select` 문은 여러 채널에서의 작업을 기다릴 수 있는 기능을 제공합니다. 여러 고루틴이 동시에 실행되고 있을 때, 어떤 채널이 먼저 데이터를 수신하는지를 기다릴 수 있습니다. 다음은 `select` 문을 사용하는 예제입니다: ```go package main import ( "fmt" "time" ) func sendData(ch chan string, msg string, delay time.Duration) { time.Sleep(delay) ch <- msg } func main() { ch1 := make(chan string) ch2 := make(chan string) go sendData(ch1, "Data from channel 1", 2*time.Second) go sendData(ch2, "Data from channel 2", 1*time.Second) select { case msg1 := <-ch1: fmt.Println(msg1) case msg2 := <-ch2: fmt.Println(msg2) } } ``` 위의 예제에서 두 개의 고루틴이 각각 다른 채널에 데이터를 전송합니다. `select` 문은 두 채널 중 먼저 데이터를 수신한 채널의 메시지를 출력합니다. 4. 동기화(Synchronization) 고루틴 간의 데이터 경쟁을 방지하기 위해 Go는 `sync` 패키지를 제공합니다. `sync.<a href='https://sangseek.com/sangseeks/Mutex/ko'>Mutex</a>`와 `sync.WaitGroup`은 고루틴의 동기화를 위한 주요 도구입니다. - Mutex : 상호 배제를 통해 여러 고루틴이 동시에 공유 자원에 접근하지 못하도록 합니다. ```go package main import ( "fmt" "sync" ) var ( counter int mu sync.Mutex ) func increment(wg *sync.WaitGroup) { defer wg.Done() mu.Lock() counter++ mu.Unlock() } func main() { var wg sync.WaitGroup for i := 0; i < 1000; i++ { wg.Add(1) go increment(&wg) } wg.Wait() fmt.Println("Final counter:", counter) } ``` - WaitGroup : 여러 고루틴이 완료될 때까지 기다리는 데 사용됩니다. 5. <a href='https://sangseek.com/sangseeks/에러 처리/ko'>에러 처리</a> 비동기 프로그래밍에서 에러 처리는 중요합니다. 고루틴 내에서 발생한 에러를 메인 고루틴으로 전달하기 위해 채널을 사용할 수 있습니다. ```go package main import ( "fmt" ) func riskyOperation(ch chan error) { // <a href='https://sangseek.com/sangseeks/에러 발생/ko'>에러 발생</a> ch <- fmt.Errorf("an error occurred") } func main() { ch := make(chan error) go riskyOperation(ch) err := <-ch if err != nil { fmt.Println("Error:", err) } } ``` 결론 Go에서 비동기 프로그래밍은 고루틴과 채널을 통해 간단하고 효율적으로 구현할 수 있습니다. 이러한 기능들은 Go의 동시성 모델을 기반으로 하여, 개발자가 복잡한 스레드 관리 없이도 비동기 작업을 쉽게 처리할 수 있도록 도와줍니다. 동기화 도구와 에러 처리 메커니즘을 적절히 활용하면, 안정적이고 효율적인 비동기 프로그램을 작성할 수 있습니다.
이용안내
커뮤니티 이용안내
×
- 게시한 게시글로 발생하는 문제는 게시자에게 책임이 있습니다.
- 게시글이 타인/타업체의 저작권을 침해할 경우 모든 책임은 게시자에게 있습니다. 게시자가 모든 손해를 부담해야 합니다.
- 상식닷컴 운영자는 게시자와 상의하지 않고 게시글을 수정 또는 삭제할 수 있습니다.
- 상식닷컴 운영자는 깨끗한 커뮤니티 공간을 만드는 것이 1순위입니다.
수정하기
취소하기