Rumah >pembangunan bahagian belakang >Golang >Kerjasama antara fungsi golang dan goroutine

Kerjasama antara fungsi golang dan goroutine

PHPz
PHPzasal
2024-04-29 12:06:01412semak imbas

Pengaturcaraan, fungsi dan gorout In Go bekerjasama untuk mencapai keselarasan. Satu goroutine dicipta dalam fungsi, dan pembolehubah tempatan bagi fungsi itu kelihatan dalam goroutine. Goroutine boleh digunakan dalam pertempuran sebenar untuk tugas pemprosesan serentak, seperti muat naik fail serentak Kecekapan boleh dipertingkatkan dengan mencipta goroutine yang bertanggungjawab untuk memuat naik fail yang berbeza. Apabila menggunakan goroutine, sila ambil perhatian: Buat goroutine dalam jumlah yang sesuai untuk mengelakkan kekurangan sumber tidak mempunyai nilai pulangan, dan anda perlu menggunakan concurrency primitif untuk mendapatkan keputusan tidak boleh dihentikan atau dibatalkan;

Kerjasama antara fungsi golang dan goroutine

Kerjasama antara fungsi Go dan Goroutine

Dalam bahasa pengaturcaraan Go, goroutine ialah mekanisme konkurensi yang boleh mencipta benang ringan untuk melaksanakan kod. Fungsi dan goroutin bekerjasama untuk mencapai pengaturcaraan serentak yang cekap.

Hubungan antara fungsi dan Goroutine

Goroutine boleh dibuat di dalam fungsi, dan pembolehubah dan pemalar tempatan dalam fungsi boleh dilihat dalam goroutine. Apabila Goroutine tamat, pembolehubah dan pemalar setempatnya akan dikitar semula.

Contoh berikut menunjukkan cara mencipta goroutine dan lulus parameter dalam fungsi:

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)
}

Dalam contoh di atas, fungsi utama mencipta goroutine dan menghantar parameter "World" . Goroutine melaksanakan fungsi printHello dan mencetak "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

Kes Praktikal: Muat Naik Fail Serentak

Pertimbangkan kes penggunaan yang memerlukan berbilang fail dimuat naik serentak:

rrreee

Dalam kes ini, fungsi utama mencipta senarai goroutin, setiap goroutine daripada sistem pengendalian Baca fail dan muat naik ke Storan Awan Google. Ini membolehkan aplikasi memuat naik berbilang fail serentak, meningkatkan prestasi dengan ketara.
  • Nota
  • Anda perlu memberi perhatian kepada perkara berikut apabila menggunakan goroutin:
  • Gorutin ringan, jadi mudah untuk mencipta sejumlah besar goroutin. Pastikan anda tidak membuat terlalu banyak goroutine dan membebankan program sumber.
🎜Goroutine keluar tanpa sebarang nilai pulangan. Jika anda ingin mendapatkan hasil goroutine, gunakan saluran atau primitif konkurensi lain. 🎜🎜Groutine adalah tanpa nama, jadi gorouti individu tidak boleh dihentikan atau dibatalkan secara langsung. 🎜🎜

Atas ialah kandungan terperinci Kerjasama antara fungsi golang dan goroutine. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn