Skip to content
GwiyeomGo Tech Blog
About GwiyeomGo

Golang(Go) Goroutine 을 써서 동시에 호출해보자

GOLANG, 20223 min read

Go 언어는 동시성(병행성) 지원한다.

Go Goroutine

go 루틴은 function 인데 함수를 동시에 실행시킨다

어떻게 사용?

  • go 키워드를 사용해 gorutine을 생성
package main
import (
"fmt"
)
func Call(name string) {
for i, _ := range name {
fmt.Printf("%s-%v", name, i)
}
}
func main() {
fmt.Println("--start--")
go Call("tom")
go Call("coco")
fmt.Println("--end--")
}

main 함수가 끝나면 모든 goroutine 도 끝난다.

//5초 후 main 함수 기다림
time.Sleep(time.Second * 5)

main 함수에서 5초간 지여니켰을때 결과를 확인해 보자

--start--
coco-0
coco-1
coco-2
coco-3
tom-0
tom-1
tom-2
--end--

이떄 호출 결과는 매번 같지 않다

예제코드

time.Sleep을 써서 코드를 실행을 지연시키는 방법 대신 다른 방법은 없을까?

고루틴을 제어하는 방식

Chanel (=파이프)

Chanel 은 gorutine 이랑 main 함수 사이에서 정보를 전달해줄때 사용할 수있다. 연결 통로가 되어 메세지를 전달하거나 받는 역할을 한다.

어떻게 사용?

  • 메세지를 보낸다 (매개변수로 전달) c := make(chan string) go Call("tom",c)

  • Call 함수는 메세지만 받음 func hitUrl(url string ,c chan string)

  • [이름] chan [메세지 타입] 이때 메세지 타입은 struct 도 가능

  • Call 함수는 메세지도 받고 c 사용해 메세지도 보낼 수 있다. func hitUrl(url string ,c chan<- string)

  • main 함수로 메세지를 보낸다. c <- fmt.Sprintf("%s say yes",name)

main 함수는 메세지를 받을때까지 기다린다.

Channel types

chan T // can be used to send and receive values of type T
chan<- float64 // can only be used to send float64s
<-chan int // can only be used to receive ints

참고

package main
import (
"fmt"
)
//매세지를 보낸다
func Call(name string ,c chan string){
//메세지를 받기만함
//func Call(name string ,c <-chan string) {
for i, _ := range name {
fmt.Printf("%s-%v\n", name, i)
}
c <- fmt.Sprintf("%s say yes",name)
}
func main() {
fmt.Println("--start--")
c := make(chan string)
go Call("tom", c)
go Call("coco", c)
result:= <-c
fmt.Println(result)
//time.Sleep(time.Second * 5)
fmt.Println("--end--")
}

실제업무에서 사용

  1. 우리서비스에서 dooray api 를 호출한다 이때 호출을 기다릴 필요가 없으니 go 를 사용해서 호출

  2. sqs 로 메세지를 저장한다 sqs 를 호출해 메세지를 가져올때 while 문으로 go 루틴을 사용해 호출한다 이때 언제올지 모르는 결과값을 받기 위해 채널을 사용

실행예제

© 2024 by GwiyeomGo Tech Blog. All rights reserved.