> 백엔드 개발 > Golang > golang 함수의 고루틴

golang 함수의 고루틴

王林
풀어 주다: 2024-04-19 17:39:02
원래의
848명이 탐색했습니다.

Goroutine은 작업을 병렬로 실행하는 Go의 경량 실행 스레드이며 go 키워드를 통해 생성되며 동시성, 경량 및 통신 기능을 갖추고 있습니다. 실제 사례에서 동시 크롤러는 고루틴을 사용하여 URL을 병렬로 크롤링하고 채널을 사용하여 동시 고루틴 수를 제한하여 성능과 시스템 리소스를 최적화합니다.

golang 함수의 고루틴

Go의 고루틴 기능

고루틴은 병렬로 실행될 수 있는 Go의 경량 실행 스레드입니다. 이를 통해 동시적이고 효율적인 코드를 작성할 수 있습니다.

고루틴 만들기

go 키워드와 함수 호출을 사용하여 고루틴을 만듭니다: go 关键字创建一个 Goroutine,后跟一个函数调用:

func main() {
    go hello()
}

func hello() {
    fmt.Println("Hello world!")
}
로그인 후 복사

goroutine 的好处

  • 并发性: Goroutine 可以同时执行多个任务,从而提高性能。
  • 轻量: Goroutine 比线程轻得多,开销更低。
  • 通信: Goroutine 可以通过通道(channels)轻松地通信。

实战案例:并发爬虫

使用 Goroutine 创建一个并发爬虫:

package main

import (
    "fmt"
    "sync"
    "time"
)

// URL 队列
var urls = []string{"url1", "url2", "url3"}

// 用于确保并发安全
var wg sync.WaitGroup

// 抓取函数
func fetch(url string) {
    // 模拟抓取
    fmt.Println("抓取", url)
    time.Sleep(100 * time.Millisecond)
    wg.Done()
}

func main() {
    // 限制并发 goroutine 的数量
    maxConcurrency := 3

    // 创建一个信道来限制并发 goroutine 的数量
    sem := make(chan struct{}, maxConcurrency)

    // 为每个 URL 创建一个 goroutine
    for _, url := range urls {
        sem <- struct{}{}
        wg.Add(1)
        go func(url string) {
            defer wg.Done()
            defer func() { <-sem }()

            fetch(url)
        }(url)
    }

    // 等待所有 goroutine 完成
    wg.Wait()
}
로그인 후 복사

在这个示例中,fetch 函数并行抓取 URL,使用信道 (semrrreee

🎜goroutine의 이점🎜🎜
  • 🎜동시성: 🎜 Goroutine 여러 작업을 동시에 수행하여 성능을 향상시킬 수 있습니다.
  • 🎜경량: 🎜 고루틴은 스레드보다 훨씬 가볍고 오버헤드도 적습니다.
  • 🎜통신: 🎜 고루틴은 채널을 통해 쉽게 통신할 수 있습니다.
🎜🎜실용 사례: 동시 크롤러🎜🎜🎜Goroutine을 사용하여 동시 크롤러 만들기: 🎜rrreee🎜이 예에서 fetch 함수는 다음을 사용하여 URL을 병렬로 크롤링합니다. 채널( sem)은 동시에 실행되는 고루틴을 최대 3개로 제한합니다. 이는 성능과 시스템 리소스의 균형을 맞추는 데 도움이 됩니다. 🎜

위 내용은 golang 함수의 고루틴의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿