Goroutines 기초
Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 107개 중 59번째.
goroutine은 Go 런타임이 관리하는 경량 실행 스레드입니다. 상당한 메모리를 사용하는 기존 스레드와 달리, goroutine은 몇 킬로바이트의 스택 공간만으로 시작하므로 수천 개를 concurrently 실행할 수 있습니다.
goroutine을 시작하려면 함수 호출 앞에 go 키워드를 배치하기만 하면 됩니다:
func sayHello(name string) {
fmt.Println("Hello,", name)
}
func main() {
go sayHello("Alice") // 동시에 실행됨
go sayHello("Bob") // 동시에 실행됨
time.Sleep(100 * time.Millisecond)
fmt.Println("Done")
}go sayHello("Alice")가 실행되면 sayHello가 끝날 때까지 기다리지 않습니다. 대신 sayHello가 백그라운드에서 실행되는 동안 즉시 다음 줄로 계속 진행합니다. 이것이 time.Sleep이 필요한 이유입니다. time.Sleep이 없으면 main은 goroutines가 완료되기 전에 종료됩니다.
익명 함수로도 goroutines를 launch할 수 있습니다:
go func(msg string) {
fmt.Println(msg)
}("Hello from goroutine")main function 자체는 goroutine에서 실행됩니다. 반환되면 다른 모든 goroutines가 즉시 종료됩니다. 다른 goroutines에는 완료할 기회가 주어지지 않습니다. time.Sleep을 사용하는 것은 임시 해결책입니다. 다음 수업에서는 channels와 wait groups를 사용한 적절한 동기화 기법을 배우게 됩니다.
챌린지
쉬움goroutine을 사용하여 여러 작업을 concurrently 실행하는 task runner를 만들어 보겠습니다. main 프로그램이 계속 실행되는 동안 작업이 백그라운드에서 실행되는 간단한 시스템을 만들고, goroutine이 동시 실행을 가능하게 하는 방식을 보여 줍니다.
코드를 두 파일에 걸쳐 구성합니다.
tasks.go: 작업 실행 로직을 Define합니다.Name(string) 및Duration(int, milliseconds를 representing) fields를 포함하는Taskstruct를 Create합니다.Task에 작업의 duration만큼 sleep하여 작업을 시뮬레이션한 다음Task [Name] completed를 Print하는Run()method를 Implement합니다.각 작업의
Run()method를 goroutine으로 launches하는RunAllTasks(tasks []Task)function을 Create합니다. All goroutines를 Launch한 After, 작업이 completed될 수 있도록 500 milliseconds 동안 sleep한 다음All tasks launched를 Print해야 합니다.main.go: 작업 정보를 Read하고 concurrently 실행을 조정합니다.작업의 수를 Read한 다음 각 작업의 이름과 duration을 Read합니다. 작업을 Create하고
RunAllTasks에 전달합니다. 이것이 반환된 After,Main function done을 Print합니다.
다음 입력이 제공됩니다.
- Line 1: 작업 수 (integer)
- Following lines: 각 작업마다 두 개의 lines - 작업 이름, 그 다음 milliseconds 단위의 duration
예를 들어 다음이 주어졌을 때:
3
Download
100
Process
50
Upload
75출력에는 작업이 completed되는 과정이 표시되고(concurrency로 인해 순서는 달라질 수 있음), 그 다음 completion messages가 표시되어야 합니다.
Task Process completed
Task Upload completed
Task Download completed
All tasks launched
Main function done참고: goroutines는 concurrently 실행되므로 duration이 짧은 작업이 일반적으로 먼저 finished됩니다. 작업 completion order는 duration에 따라 달라지며, 짧은 작업이 긴 작업보다 먼저 completed됩니다.
지연에는 time.Sleep을 time.Duration 및 time.Millisecond와 함께 사용하세요. RunAllTasks의 sleep이 없으면 goroutines가 작업을 끝내기 전에 function이 반환된다는 점을 기억하세요.
직접 해보기
package main
import (
"fmt"
)
func main() {
// 작업 수를 읽습니다
var numTasks int
fmt.Scanln(&numTasks)
// TODO: 작업을 담을 슬라이스를 생성합니다
// TODO: 각 작업의 이름과 지속 시간을 읽습니다
// 각 작업에 대해:
// - 작업 이름을 읽습니다
// - 지속 시간을 읽습니다 (정수로)
// - Task를 생성하고 슬라이스에 추가합니다
// TODO: 작업 슬라이스로 RunAllTasks를 호출합니다
// TODO: Print "Main function done"
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
8에러 처리와 OOP
error 인터페이스사용자 정의 에러 타입에러 래핑 (fmt.Errorf)센티넬 에러errors.Is()와 errors.As()Panic, Defer, Recover요약 - 파일 파서직접 연습해 보세요: 온라인 Go 컴파일러