Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Gunakan Go untuk mengendalikan permintaan serentak berskala besar dengan cekap

Gunakan Go untuk mengendalikan permintaan serentak berskala besar dengan cekap

WBOY
WBOYasal
2024-06-01 16:29:01838semak imbas

Dengan menggunakan primitif serentak Go seperti goroutine dan saluran, anda boleh mengendalikan permintaan serentak berskala besar dengan cekap: mencipta bilangan goroutin yang tetap dan menggunakan saluran untuk menimpan permintaan. Lindungi sumber yang dikongsi dengan kunci atau mutex. Hadkan bilangan permintaan serentak, contohnya dengan menggunakan konteks untuk menetapkan tamat masa.

Gunakan Go untuk mengendalikan permintaan serentak berskala besar dengan cekap

Mengendalikan permintaan serentak berskala besar dengan cekap dengan Go

Pengenalan
Mengendalikan permintaan serentak berskala besar merupakan cabaran biasa, terutamanya dalam perkhidmatan mikro dan aplikasi web. Go ialah bahasa yang dibina untuk konkurensi dan amat sesuai untuk mengendalikan beban kerja sedemikian. Artikel ini akan memperkenalkan primitif serentak Go dan amalan terbaik serta menggunakan kes praktikal untuk menunjukkan cara mengendalikan permintaan serentak berskala besar dengan cekap.

Goroutine dan Saluran
Goroutine ialah unit perlaksanaan selari ringan dalam Go, serupa dengan utas. Saluran adalah mekanisme untuk komunikasi antara goroutine.

Amalan Terbaik

  • Buat bilangan goroutin tetap dan bukannya mencipta goroutin baharu untuk setiap permintaan.
  • Gunakan saluran untuk menimbal permintaan dan mengehadkan bilangan permintaan serentak.
  • Gunakan kunci atau mutex untuk melindungi sumber yang dikongsi.

Kes praktikal
Kami mencipta aplikasi web untuk memproses fail yang dimuat naik oleh pengguna. Aplikasi perlu mengendalikan berbilang permintaan muat naik fail secara serentak.

package main

import (
    "context"
    "log"
    "net/http"
    "sync"
)

const maxConcurrency = 10

var wg sync.WaitGroup

func main() {
    http.HandleFunc("/upload", uploadHandler)
    http.ListenAndServe(":8080", nil)
}

func uploadHandler(w http.ResponseWriter, r *http.Request) {
    wg.Add(1)
    defer wg.Done()

    // 创建一个 goroutine 来处理文件上传
    go func() {
        defer r.Body.Close()
        if err := handleFileUpload(r.Body); err != nil {
            log.Println(err)
        }
    }()
    
    // 限制并发上传的数量
    ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
    defer cancel()
    select {
    case <-ctx.Done():
        http.Error(w, "Too many concurrent uploads", http.StatusTooManyRequests)
        return
    default:
    }
}

func handleFileUpload(r io.Reader) error {
    // 省略实际的文件上传处理
    return nil
}

Kesimpulan
Dengan mengikuti amalan terbaik yang dibentangkan dalam artikel ini, anda boleh membina aplikasi Go yang cekap dan berskala yang boleh mengendalikan permintaan serentak berskala besar.

Atas ialah kandungan terperinci Gunakan Go untuk mengendalikan permintaan serentak berskala besar dengan cekap. 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