Golang(Go) Goroutine 을 써서 동시에 호출해보자
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-0coco-1coco-2coco-3tom-0tom-1tom-2--end--
이떄 호출 결과는 매번 같지 않다
time.Sleep
을 써서 코드를 실행을 지연시키는 방법 대신
다른 방법은 없을까?
고루틴을 제어하는 방식
- WaitGroup 을 사용해 고루틴 종료 알림
- Chanel 사용 고루틴을 제어하는 방식에 대해 정리한 글이 있어서 공유
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 Tchan<- 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--")}
실제업무에서 사용
-
우리서비스에서 dooray api 를 호출한다 이때 호출을 기다릴 필요가 없으니 go 를 사용해서 호출
-
sqs 로 메세지를 저장한다 sqs 를 호출해 메세지를 가져올때 while 문으로 go 루틴을 사용해 호출한다 이때 언제올지 모르는 결과값을 받기 위해 채널을 사용