Rumah  >  Artikel  >  pembangunan bahagian belakang  >  golang set timeout

golang set timeout

王林
王林asal
2023-05-16 14:32:382172semak imbas

Golang ialah bahasa pengaturcaraan yang cekap yang digunakan secara meluas dalam pembangunan dalam pelbagai bidang. Dalam beberapa senario tertentu, kita perlu menetapkan tamat masa untuk mengelakkan kebuntuan atau tersekat dalam program. Dalam artikel ini, saya akan memperkenalkan secara terperinci bagaimana Golang menetapkan tamat masa, dan beberapa cara untuk menetapkan tamat masa.

1. Gunakan saluran

Di Golang, anda boleh menggunakan saluran untuk melaksanakan fungsi tamat masa. Kita boleh menentukan saluran dengan parameter tamat masa dan mendapatkan semula data mengikut masa tamat masa selepas program dilaksanakan.

Sebagai contoh, berikut ialah kod sampel mudah:

package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan string, 1)

    go func() {
        time.Sleep(time.Second * 3)
        ch <- "task completed"
    }()

    select {
    case res := <-ch:
        fmt.Println(res)
    case <-time.After(time.Second * 2):
        fmt.Println("timeout")
    }
}

Kita dapat melihat bahawa saluran dengan parameter tamat masa dibuat Selepas program dilaksanakan, coroutine serentak akan dimulakan. Ia mengambil masa 3 saat untuk proses melaksanakan tugas. Dalam pernyataan pilih, kami mendengar dua saluran. Jika data diterima dalam masa tamat masa, iaitu, pelaksanaan tugas selesai, program akan mencetak "tugas selesai". Jika tiada data diterima dalam tempoh tamat masa, program akan mencetak "masa tamat".

2. Gunakan konteks

Di Golang, pakej konteks menyediakan kaedah untuk menghantar data julat permintaan, isyarat pembatalan dan tamat masa. Kita boleh menggunakan fungsi WithTimeout untuk mencipta objek Konteks yang membawa tamat masa.

Sebagai contoh, berikut ialah kod sampel mudah:

package main

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

func main() {
    ctx, cancel := context.WithTimeout(context.Background(), time.Second*2)
    defer cancel()

    go func(ctx context.Context) {
        time.Sleep(time.Second * 3)
        select {
        case <-ctx.Done():
            fmt.Println(ctx.Err())
        default:
            fmt.Println("task completed")
        }
    }(ctx)

    select {
    case <-ctx.Done():
        fmt.Println(ctx.Err())
    }
}

Dalam contoh ini, kami menggunakan fungsi WithTimeout untuk mencipta objek Konteks dengan tamat masa 2 saat. Dalam coroutine serentak yang didayakan, kami menyekat dan menunggu selama 2 saat Jika tugasan selesai dalam masa 2 saat, coroutine akan mencetak "tugas selesai", jika tidak, ia akan mencetak mesej ralat tamat masa konteks. Dalam pernyataan pilih, kami mendengar saluran Done() bagi objek Konteks. Jika isyarat saluran Done() diterima, program akan membatalkan tugas dan mengeluarkan mesej ralat.

3. Gunakan cancel

Dalam beberapa kes tertentu, kami mungkin perlu membatalkan pelaksanaan tugas dengan menetapkan fungsi batal. Contohnya, dalam senario di mana data diminta daripada rangkaian, tamat masa mungkin ditetapkan Jika tiada data diminta dalam tamat masa, kami perlu membatalkan permintaan.

Sebagai contoh, berikut ialah kod sampel mudah:

package main

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

func main() {
    ctx, cancel := context.WithTimeout(context.Background(), time.Second*2)
    defer cancel()

    ch := make(chan string, 1)

    go func(ctx context.Context) {
        time.Sleep(time.Second * 3)
        ch <- "task completed"
    }(ctx)

    select {
    case res := <-ch:
        fmt.Println(res)
    case <-ctx.Done():
        fmt.Println(ctx.Err())
    }

    cancel()
}

Dalam contoh ini, kami mencipta objek Konteks yang membawa tamat masa dan memulakan coroutine serentak untuk melaksanakan tugas. Dalam penyataan pilih, kami memantau saluran Selesai() tugas dan objek Konteks Jika tugasan selesai, "tugas selesai" akan dikeluarkan, jika tidak mesej ralat tamat masa akan dikeluarkan. Panggil fungsi cancel() pada penghujung program untuk membatalkan pelaksanaan tugas. Jika tugasan selesai dalam tempoh tamat masa, program akan keluar seperti biasa. Jika tidak, program akan disekat dalam penyataan pilih sehingga fungsi cancel() dilaksanakan.

4. Gunakan tarikh akhir

Selain menggunakan fungsi WithTimeout, pakej konteks juga menyediakan cara lain untuk tamat masa, iaitu menggunakan fungsi WithDeadline. Tidak seperti fungsi WithTimeout, parameter fungsi WithDeadline ialah tarikh akhir, bukan tamat masa. Apabila tugasan selesai sebelum tarikh akhir, program akan keluar seperti biasa.

Sebagai contoh, berikut ialah kod sampel mudah:

package main

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

func main() {
    ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(time.Second*2))
    defer cancel()

    go func(ctx context.Context) {
        time.Sleep(time.Second * 3)
        select {
        case <-ctx.Done():
            fmt.Println(ctx.Err())
        default:
            fmt.Println("task completed")
        }
    }(ctx)

    select {
    case <-ctx.Done():
        fmt.Println(ctx.Err())
    }
}

Dalam contoh ini, kami menggunakan fungsi WithDeadline untuk mencipta objek Konteks dengan tarikh akhir 2 saat. Jika tugas selesai sebelum tarikh akhir, program akan mengeluarkan "tugas selesai", jika tidak, ia akan mengeluarkan mesej ralat tamat masa. Dalam pernyataan pilih, kami juga mendengar saluran Done() bagi objek Konteks. Jika isyarat daripada saluran Done() diterima, program akan mengeluarkan mesej ralat.

Ringkasan:

Golang menyediakan pelbagai cara untuk menetapkan tamat masa. Dengan menggunakan kaedah seperti saluran, konteks, pembatalan dan tarikh akhir, kami boleh mengelakkan kebuntuan program atau masalah tersekat dan memastikan kecekapan dan kestabilan operasi program. Dalam pembangunan sebenar, mengikut keperluan dan senario yang berbeza, kita boleh memilih kaedah yang sesuai untuk menetapkan tamat masa.

Atas ialah kandungan terperinci golang set timeout. 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
Artikel sebelumnya:kaedah pandangan golangArtikel seterusnya:kaedah pandangan golang