English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Golang 기본教程

Golang 제어문

Golang 함수 & 메서드

Golang 구조체

Golang 슬라이스 & 배열

Golang 문자열(String)

Golang 포인터

Golang 인터페이스

Golang 동기

Golang 예외(Error)

Golang 다른杂项

Go 동기화(Goroutines)

Go 언어는 Goroutines라는 특별한 기능을 제공합니다. Goroutine는함수또는 메서드는 프로그램에 존재하는 다른 어떤 Goroutine와도 독립적으로 동시에 실행될 수 있습니다. 다른 말로 하면, 동시에 실행되는 모든 활동은 Go 언어에서 Goroutines로 불립니다. Goroutine는 가벼운 스레드로 볼 수 있습니다. 스레드와 비교하여 Goroutine 생성 비용은 매우 낮습니다. 각 프로그램은 최소한 하나의 Goroutine를 포함하고, 이 Goroutine는주 Goroutine。주 Goroutine가 종료되면, 주 Goroutine 아래에 실행되는 모든 Goroutine가 종료됩니다. 따라서 프로그램에 존재하는 모든 goroutine도 종료됩니다. Goroutine는 항상 배경에서 실행됩니다.

Goroutine를 어떻게 생성하나요?

함수나 메서드 호출 전에 go 키워드를 사용하여 자신의 Goroutine를 생성할 수 있습니다. 다음 문법과 같이:

문법:

func     name(){
// 문장
}
// 함수 이름 앞에 go 키워드를 사용합니다.
go     name()
package main 
  
import     "fmt"
  
func     display(str     string)     { 
    for     w  :=  0;     w  < 6;     w++ { 
        fmt.Println(str) 
    } 
} 
  
func main() { 
  
    // Goroutine 호출 
    go display("Welcome") 
  
    //일반 함수 호출
    display("oldtoolbag.com) 
}

출력:

oldtoolbag.com
oldtoolbag.com
oldtoolbag.com
oldtoolbag.com
oldtoolbag.com
oldtoolbag.com

위의 예제에서 우리는 단지display()함수를 호출한 후 이 함수를 두 가지 방식으로 호출합니다. 하나는 Goroutine, 즉 go display("Welcome")이며, 다른 하나는 일반 함수 호출, 즉 display("w"3codebox)

하지만 문제를 발견할 수 있습니다. 그것은 일반 함수 호출의 결과만 표시하며, Goroutine의 결과는 표시하지 않습니다. 왜냐하면 새로운 Goroutine가 실행될 때, Goroutine 호출은 즉시 반환되기 때문입니다. 일반 함수와 같이 Goroutine가 완료되기를 기다리지 않습니다. 그들은 항상 Goroutine 호출 후 다음 줄까지 진행되며, Goroutine가 반환하는 값을 무시합니다. 따라서 Goroutine를 올바르게 실행하기 위해 프로그램에 일부 변경을 가했습니다. 다음 코드와 같이:

수정된 Goroutine 예제:

package main 
  
import ( 
    "fmt"
    "time"
) 
  
func     display(str     string)     { 
    for     w  :=  0;     w  < 6;     w++ { 
        time.Sleep(1 * time.Second) 
        fmt.Println(str) 
    } 
} 
  
func main() { 
  
    // Goroutine 호출 
    go display("Welcome") 
  
    //일반 함수 호출
    display("w3codebox) 
}

출력:

Welcome
w3codebox
w3codebox
Welcome
Welcome
w3codebox
w3codebox
Welcome
Welcome
w3codebox
w3codebox

우리는 프로그램에 Sleep() 메서드를 추가하여 주Goroutine이 새로운 Goroutine의 실행 중에 잠시 동안 자리를 잡도록 했습니다.1초 사이에서 잠시 동안 자리를 잡습니다1초 사이에서 화면에 환영 문구를 표시하고, 그 후1초의 메인 Goroutine이 다시 스케줄링되어 작업을 수행한 후 종료됩니다. 이 과정은 z의 값이 <6그 뒤에 메인 Goroutine이 종료됩니다. 여기서 Goroutine과 일반 함수가 동시에 작동합니다.

Goroutine의 장점

  • Goroutine은 스레드보다 소비량이 적습니다.

  • Goroutine은 스택에 저장되며, 스택의 크기는 프로그램의 요구에 따라 확장되고 축소될 수 있습니다. 그러나 스레드에서 스택의 크기는 고정됩니다.

  • Goroutine은 채널을 통해 통신할 수 있으며, 이 채널은 특별히 설계되어 있어 Goroutine이 공유 메모리에 접근할 때 발생할 수 있는 경쟁 상황을 방지할 수 있습니다.

  • 프로그램이 하나의 스레드를 가지고 있으며, 이 스레드는 많은 Goroutine과 연결되어 있다고 가정해 보겠습니다. 어떤 Goroutine이 자원 요구로 인해 스레드를 블록시키면, 나머지 모든 Goroutine은 새로운 OS 스레드로 배분됩니다. 이러한 모든 세부 사항은 프로그래머에게는 숨겨져 있습니다.

익명 Goroutine

Go 언어에서는 익명 함수를 사용하여 Goroutine을 시작할 수 있습니다. 다시 말해, go 키워드를 함수의 접두사로 사용하여 익명 Goroutine을 생성할 수 있습니다. 다음과 같은 문법을 참고하세요:

문법:

//익명 함수 호출
go func (parameter_list){
    // 문장
)(arguments)
package main 
  
import ( 
    "fmt"
    "time"
) 
  
func main() { 
  
    fmt.Println("반갑습니다!! 메인 함수로") 
  
    //익명 Goroutine 생성
    go func() { 
  
        fmt.Println("반갑습니다!! w)3codebox.com) 
    }) 
  
    time.Sleep(1 * time.Second) 
    fmt.Println("안녕히 가세요!! 메인 함수로") 
}

출력:

반갑습니다!! 메인 함수로
반갑습니다!! w로3codebox.com
안녕히 가세요!! 메인 함수로