goroutine 실행과 goroutine의sync.WaitGroup 역할
13027 단어 Go
goroutine 실행
아래와 같다
"100*time. Millisecond당 5번 Hello를 표시하는 방법sayhello와 100*time. Millisecond당 5번 세계를 표시하는 방법 goroutine"
에서 설명한 방법의 대체 방법입니다.
main.gopackage main
import (
"fmt"
"time"
)
func sayworld(s string) {
for i := 0; i < 5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func sayhello(s string) {
for i := 0; i < 5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func main() {
sayworld("world")
sayhello("hello")
}
//出力結果
// world
// world
// world
// world
// world
// hello
// hello
// hello
// hello
// hello
이것은 병행 처리가 아니기 때문에 당연히 위에서 아래로 순서대로'sayworld방법=>sayhello방법'의 순서에 따라 실행한다.
그러면 Go에서 어떻게 병행 처리합니까 (sayworld 방법과sayhello 방법을 동시에 실행합니까).
sayworld 방법 전에 go를 추가하면 됩니다.
main.gopackage main
import (
"fmt"
"time"
)
func sayworld(s string) {
for i := 0; i < 5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func sayhello(s string) {
for i := 0; i < 5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func main() {
//sayworldを別スレッドでgoroutineとして同時実行
go sayworld("world")
sayhello("hello")
}
//出力結果
// world
// hello
// hello
// world
// world
// hello
// hello
// world
// world
// hello
이렇게 하면 Go에서 주 라인에서 실행되는 함수와 동시에 실행되는 함수에 go를 더하면 병렬 처리가 가능하다.
sync.WaitGroup 역할
다음은 타임.Sleep(100*time.Millisecond)에 대한 설명을 시도합니다.
main.gopackage main
import (
"fmt"
_ "time"
)
func sayworld(s string) {
for i := 0; i < 5; i++ {
// time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func sayhello(s string) {
for i := 0; i < 5; i++ {
// time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func main() {
//sayworldを別スレッドで同時実行
go sayworld("world")
sayhello("hello")
}
//出力結果
// hello
// hello
// hello
// hello
// hello
그래서 병행 처리해야 할sayworld 방법은 실행되지 않고 sayhello만 실행됩니다.
메인 라인의sayhello가'sayworld가goroutine로 시작=> 실행'하기 전에 끝났기 때문입니다.
즉,'sayworld가goroutin으로 시작하기=> 실행'을 기다리면 됩니다.
이것은 wgsync입니다.WaitGroup 사용
package main
import (
"fmt"
"time"
)
func sayworld(s string) {
for i := 0; i < 5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func sayhello(s string) {
for i := 0; i < 5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func main() {
sayworld("world")
sayhello("hello")
}
//出力結果
// world
// world
// world
// world
// world
// hello
// hello
// hello
// hello
// hello
package main
import (
"fmt"
"time"
)
func sayworld(s string) {
for i := 0; i < 5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func sayhello(s string) {
for i := 0; i < 5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func main() {
//sayworldを別スレッドでgoroutineとして同時実行
go sayworld("world")
sayhello("hello")
}
//出力結果
// world
// hello
// hello
// world
// world
// hello
// hello
// world
// world
// hello
다음은 타임.Sleep(100*time.Millisecond)에 대한 설명을 시도합니다.
main.go
package main
import (
"fmt"
_ "time"
)
func sayworld(s string) {
for i := 0; i < 5; i++ {
// time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func sayhello(s string) {
for i := 0; i < 5; i++ {
// time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func main() {
//sayworldを別スレッドで同時実行
go sayworld("world")
sayhello("hello")
}
//出力結果
// hello
// hello
// hello
// hello
// hello
그래서 병행 처리해야 할sayworld 방법은 실행되지 않고 sayhello만 실행됩니다.메인 라인의sayhello가'sayworld가goroutine로 시작=> 실행'하기 전에 끝났기 때문입니다.
즉,'sayworld가goroutin으로 시작하기=> 실행'을 기다리면 됩니다.
이것은 wgsync입니다.WaitGroup 사용
package main
import (
"fmt"
"sync"
)
//引数にwgのポインタを宣言
func sayworld(s string, wg *sync.WaitGroup) {
//wg.Done()で処理の終了を伝える(deferで関数の最後に実行する)
defer wg.Done()
for i := 0; i < 5; i++ {
fmt.Println(s)
}
}
func sayhelllo(s string) {
for i := 0; i < 5; i++ {
fmt.Println(s)
}
}
func main() {
var wg sync.WaitGroup
//wg.Add(n)でwgにn個の並列処理があるということを伝える
wg.Add(1)
//実行したいgoroutineにwgのアドレスを渡す
go sayworld("world", &wg)
sayhelllo("hello")
//「goroutinの処理がwg.Done()されるまで終了しないで」と言うことをwg.Wait()で伝える
wg.Wait()
}
//出力結果
// hello
// hello
// hello
// hello
// hello
// world
// world
// world
// world
// world
이렇게 해서main 라인과goroutin을 믿음직스럽게 병행 처리합니다
Reference
이 문제에 관하여(goroutine 실행과 goroutine의sync.WaitGroup 역할), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/wjtnk/items/41a937107d9457b2db46텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)