Bagaimanakah Saya Boleh Membatalkan Goroutine dengan Anggun Selepas Had Masa Ditentukan dalam Go?

Mary-Kate Olsen
Lepaskan: 2024-11-19 19:25:03
asal
740 orang telah melayarinya

How Can I Gracefully Cancel Goroutines After a Specified Time Limit in Go?

Membatalkan Goroutines selepas Had Masa

Dalam senario ujian beban, mengawal tempoh pelaksanaan Goroutines adalah penting. Berikut ialah pendekatan yang berkesan untuk mencapai perkara ini.

Pertimbangkan coretan kod berikut yang mengurus permintaan HTTP dalam Goroutines:

func attack(cfg AttackConfig) {
    // some code ...

    var ar attackResponse
    ch := make(chan uint8, 8)

    go func() {
        time.Sleep(cfg.Duration * time.Second)
        ch <- CALL_TIME_RAN_OUT
    }()

    for {
        if atomic.LoadInt32(&currConnections) < atomic.LoadInt32(&maxConnections) - 1 {
            go httpPost(cfg, &ar, ch)
        }

        switch <-ch {
        // some other cases ...
        case CALL_TIME_RAN_OUT:
            fmt.Printf("%d seconds have elapsed. Shutting down!", cfg.Duration)
            return
        }
    }
}
Salin selepas log masuk

Walau bagaimanapun, Goroutines daripada httpPost() terus berjalan selepas cfg.Duration yang ditentukan telah berlalu.

Untuk menangani isu ini, anda boleh memanfaatkan pakej konteks Go. Dengan menghantar objek konteks.Konteks ke Goroutines anda, anda boleh membatalkan Goroutines tersebut apabila tamat masa yang ditentukan telah dicapai.

Berikut ialah versi semakan kod anda menggunakan pakej konteks:

import (
    "context"
    "fmt"
    "golang.org/x/net/context"
    "time"
)

func attack(cfg AttackConfig) {
    // some code ...

    var ar attackResponse

    // Define a timeout context
    ctx, cancel := context.WithTimeout(context.Background(), cfg.Duration*time.Second)
    defer cancel()

    go func() {
        time.Sleep(cfg.Duration * time.Second)
        cancel()
    }()

    for {
        if atomic.LoadInt32(&currConnections) < atomic.LoadInt32(&maxConnections) - 1 {
            go httpPost(ctx, cfg, &ar)
        }

        select {
        // some other cases ...
        case <-ctx.Done():
            fmt.Printf("%d seconds have elapsed. Shutting down!", cfg.Duration)
            return
        }
    }
}

func httpPost(ctx context.Context, cfg AttackConfig, a *attackResponse) {
    // some code here to create HTTP client ...

    for {
        // some code to make HTTP call ...

        select {
        case <-ctx.Done():
            return
        default:
        }
    }
}
Salin selepas log masuk

Dengan pengubahsuaian ini, apabila cfg.Duration yang ditentukan tamat tempoh, saluran ctx.Done() ditutup, menandakan pembatalan httpPost() Goroutines, yang kemudiannya akan kembali.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Membatalkan Goroutine dengan Anggun Selepas Had Masa Ditentukan dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan