Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menamatkan Masa dengan Anggun Goroutine dalam Go?

Bagaimana untuk Menamatkan Masa dengan Anggun Goroutine dalam Go?

Patricia Arquette
Patricia Arquetteasal
2024-11-19 11:56:021082semak imbas

How to Gracefully Timeout Goroutines in Go?

Cara Menghentikan Masa Goroutine dalam Go to Control Execution Time

Goroutines, sebahagian penting daripada Go concurrency, membenarkan pelaksanaan tugasan tidak segerak. Walau bagaimanapun, kadangkala, adalah perlu untuk mengawal tempoh rutin ini dan menghalangnya daripada melaksanakan selama-lamanya.

Latar Belakang dan Masalah

Dalam alat ujian beban anda, anda ingin menamatkan goroutine selepas masa tertentu untuk mengehadkan tempoh proses panggilan HTTP. Pendekatan semasa menggunakan masa.Sleep() dalam goroutine mencipta saluran untuk komunikasi, tetapi ia mengakibatkan penamatan pramatang goroutine.

Penyelesaian menggunakan Konteks

Lagi pendekatan yang disyorkan melibatkan penggunaan pakej golang.org/x/net/context (tersedia dalam perpustakaan standard dalam Go 1.7 ), khususnya konteks.Antara muka konteks. Konteks menyediakan mekanisme untuk membatalkan atau meluangkan masa goroutines.

Coretan kod berikut menunjukkan penyelesaian ini:

package main

import (
    "context"
    "fmt"
    "time"
)

func test(ctx context.Context) {
    t := time.Now()

    select {
    case <-time.After(1 * time.Second):
        fmt.Println("overslept")
    case <-ctx.Done():
    }
    fmt.Println("used:", time.Since(t))
}

func main() {
    ctx, _ := context.WithTimeout(context.Background(), 50*time.Millisecond)
    test(ctx)
}

Dalam kod ini:

  • Konteks. Konteks dicipta dengan tamat masa 50 milisaat menggunakan konteks.WithTimeout().
  • The test() goroutine berjalan dalam konteks ini dan menunggu arahan melalui pilih.
  • Selepas tamat masa berlalu, pilih menerima isyarat ctx.Done() dan keluar dari goroutine dengan anggun, mengelakkan tidur berlebihan.

Atas ialah kandungan terperinci Bagaimana untuk Menamatkan Masa dengan Anggun Goroutine dalam Go?. 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