>백엔드 개발 >Golang >golang 함수와 goroutine의 협업

golang 함수와 goroutine의 협업

PHPz
PHPz원래의
2024-04-29 12:06:01411검색

In Go 프로그래밍, 함수 및 고루틴은 동시성을 달성하기 위해 함께 작동합니다. 고루틴은 함수에서 생성되며, 함수의 지역 변수는 고루틴에서 볼 수 있습니다. 고루틴은 동시 파일 업로드와 같은 동시 처리 작업을 위한 실제 전투에서 사용할 수 있으며, 다양한 파일 업로드를 담당하는 고루틴을 생성하여 효율성을 향상시킬 수 있습니다. 고루틴을 사용할 때 주의할 점: 리소스 부족을 방지하기 위해 적절한 양의 고루틴을 생성하십시오. 고루틴에는 반환 값이 없으며 결과를 얻으려면 동시성 기본 요소를 사용해야 합니다. 고루틴은 직접 중지하거나 취소할 수 없습니다.

golang 함수와 goroutine의 협업

Go 함수와 Goroutine 간의 협력

Go 프로그래밍 언어에서 goroutine은 코드를 실행하기 위해 경량 스레드를 생성할 수 있는 동시성 메커니즘입니다. 함수와 고루틴은 함께 작동하여 효율적인 동시 프로그래밍을 달성합니다.

함수와 고루틴의 연결

고루틴은 함수 내부에서 생성될 수 있으며, 함수의 지역 변수와 상수는 고루틴에서 볼 수 있습니다. 고루틴이 종료되면 지역 변수와 상수가 재활용됩니다.

다음 예에서는 고루틴을 생성하고 함수에 매개변수를 전달하는 방법을 보여줍니다.

package main

import (
    "fmt"
    "time"
)

func printHello(name string) {
    fmt.Printf("Hello, %s!\n", name)
}

func main() {
    go printHello("World")
    time.Sleep(1 * time.Second)
}

위 예에서 main 함수는 고루틴을 생성하고 "World" 매개변수를 전달합니다. . 고루틴은 printHello 함수를 실행하고 "Hello, World!n"을 인쇄합니다. main 函数创建一个 goroutine 并传入参数"World"。goroutine 执行 printHello 函数,打印出 "Hello, World!n"

实战案例:并发文件上传

考虑一个需要并发上传多个文件的用例:

package main

import (
    "context"
    "fmt"
    "io"
    "os"
    "path/filepath"
    "time"

    "cloud.google.com/go/storage"
)

func uploadFile(w io.Writer, bucketName, objectName string) error {
    ctx := context.Background()
    client, err := storage.NewClient(ctx)
    if err != nil {
        return fmt.Errorf("storage.NewClient: %v", err)
    }
    defer client.Close()

    f, err := os.Open(objectName)
    if err != nil {
        return fmt.Errorf("os.Open: %v", err)
    }
    defer f.Close()

    ctx, cancel := context.WithTimeout(ctx, time.Second*30)
    defer cancel()

    o := client.Bucket(bucketName).Object(objectName)
    wc := o.NewWriter(ctx)
    if _, err := io.Copy(wc, f); err != nil {
        return fmt.Errorf("io.Copy: %v", err)
    }
    if err := wc.Close(); err != nil {
        return fmt.Errorf("Writer.Close: %v", err)
    }
    fmt.Fprintf(w, "File %v uploaded to %v.\n", objectName, bucketName)
    return nil
}

func main() {
    bucketName := "bucket-name"
    objectNames := []string{"file1.txt", "file2.txt", "file3.txt"}

    for _, objectName := range objectNames {
        go uploadFile(os.Stdout, bucketName, objectName)
    }
}

在这个案例中,main

실용 사례: 동시 파일 업로드

여러 파일을 동시에 업로드해야 하는 사용 사례를 고려해보세요.

rrreee

이 경우 main 함수는 고루틴 목록을 생성합니다. 운영체제 파일을 읽고 Google Cloud Storage에 업로드합니다. 이를 통해 애플리케이션은 여러 파일을 동시에 업로드하여 성능을 크게 향상시킬 수 있습니다.
  • Notes
  • 고루틴을 사용할 때 다음 사항에 주의해야 합니다.
  • 고루틴은 가볍기 때문에 많은 수의 고루틴을 생성하기 쉽습니다. 너무 많은 고루틴을 생성하여 프로그램 리소스를 고갈시키지 않도록 하세요.
🎜Goroutine은 반환 값 없이 종료됩니다. 고루틴의 결과를 얻으려면 채널이나 다른 동시성 기본 요소를 사용하세요. 🎜🎜고루틴은 익명이므로 개별 고루틴을 직접 중지하거나 취소할 수 없습니다. 🎜🎜

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

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