>백엔드 개발 >Golang >Golang 비동기 프로그래밍 도구: Goroutines 작동 방식에 대한 심층적인 이해

Golang 비동기 프로그래밍 도구: Goroutines 작동 방식에 대한 심층적인 이해

WBOY
WBOY원래의
2023-07-18 13:49:071248검색

Golang 비동기 프로그래밍 도구: 고루틴의 작동 원리에 대한 심층적인 이해

소개:
오늘날의 동시성 높은 인터넷 시대에 비동기 프로그래밍은 없어서는 안 될 기술적 수단이 되었습니다. 높은 동시성과 높은 확장성을 위해 설계된 언어인 Go 언어에는 고루틴이라는 강력한 동시성 모델이 함께 제공됩니다. 이 기사에서는 고루틴의 작동 방식을 심층적으로 살펴보고 몇 가지 코드 예제를 통해 강력한 비동기 프로그래밍 기능을 설명합니다.

1. 고루틴이란? 고루틴은 Go 언어의 경량 스레드로, 함수나 메서드의 동시 실행 방법으로 간주될 수 있습니다. Go 언어에 내장된 키워드
를 통해 프로그램에서 고루틴을 만들 수 있습니다. 고루틴을 생성하면 Go 언어가 자동으로 실행 일정을 예약하고 관리합니다. go

2. 고루틴 작동 방식

고루틴은 협력 스케줄링(협력 스케줄링)이라는 방법을 통해 동시 실행을 달성합니다. 전통적인 스레딩 모델에서 스레드의 실행 시간은 운영 체제에 의해 예약됩니다. 고루틴에서 Go 언어의 런타임은 고루틴 실행 일정을 담당합니다.

고루틴이 생성되면 실행 예약을 기다리는 고루틴 스케줄러(Goroutine Scheduler)에 배치됩니다. 고루틴 실행이 예약되면 Go 언어 런타임은 고루틴을 실행하기 위해 스레드를 할당합니다. 이 고루틴이 실행 중에 차단이 발생하면(예: IO가 완료될 때까지 대기) Go 언어는 현재 이 고루틴을 실행하는 스레드를 재활용한 다음 다른 유휴 스레드를 사용하여 다른 고루틴을 실행합니다. 차단이 해제되면 고루틴은 스케줄러에 다시 들어가 스케줄링 실행을 기다립니다. 이 협업 스케줄링 방법은 컴퓨팅 리소스를 최대한 활용하고 여러 스레드 간의 빈번한 전환으로 인한 오버헤드를 피할 수 있습니다.

3. 예시 설명

다음은 고루틴의 강력한 비동기 프로그래밍 기능을 설명하기 위해 몇 가지 예시를 사용합니다.

    여러 작업을 동시에 실행
  1. package main
    
    import (
        "fmt"
        "time"
    )
    
    func doTask(id int) {
        time.Sleep(time.Second) // 模拟执行耗时任务
        fmt.Println("Task", id, "done")
    }
    
    func main() {
        for i := 0; i < 10; i++ {
            go doTask(i) // 创建一个Goroutine并调度执行任务
        }
    
        time.Sleep(5 * time.Second) // 等待5秒,确保所有任务都执行完毕
        fmt.Println("All tasks done")
    }
위 코드를 실행하면 다음과 유사한 결과가 출력됩니다.

Task 0 done
Task 1 done
Task 2 done
Task 3 done
Task 4 done
Task 5 done
Task 6 done
Task 7 done
Task 8 done
Task 9 done
All tasks done

보시다시피 10개의 작업이 순차적이 아닌 동시에 실행됩니다.

    고루틴 간의 통신에는 채널을 사용하세요
  1. package main
    
    import "fmt"
    
    func sendMsg(ch chan string, msg string) {
        ch <- msg // 向通道发送消息
    }
    
    func main() {
        ch := make(chan string) // 创建一个字符串通道
    
        go sendMsg(ch, "Hello")
        go sendMsg(ch, "World")
    
        msg1 := <-ch // 从通道接收消息
        msg2 := <-ch
    
        fmt.Println(msg1, msg2) // 输出 "Hello World"
    }
위의 예는 채널을 통한 고루틴 간의 데이터 전송을 보여줍니다. 채널을 사용하면 동시에 실행되는 여러 고루틴 간의 협업과 통신을 달성할 수 있습니다.

결론:

고루틴의 작동 방식을 깊이 이해하면 Golang에서 비동기 프로그래밍의 모든 잠재력을 실현할 수 있습니다. 고루틴을 합리적으로 사용함으로써 우리는 컴퓨팅 리소스를 더 잘 활용하고 시스템의 동시성 성능을 향상시킬 수 있습니다. 동시에 고루틴은 채널을 통해 고루틴 간에 통신함으로써 보다 강력하고 효율적인 비동기 프로그래밍 프로그램을 구축할 수 있는 강력한 동시 프로그래밍 모델을 제공합니다.

위 내용은 Golang 비동기 프로그래밍 도구: Goroutines 작동 방식에 대한 심층적인 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.