Bagaimana untuk mengesan apabila tamat masa berlaku menggunakan Go's WithTimeout

WBOY
Lepaskan: 2024-02-09 11:00:18
ke hadapan
593 orang telah melayarinya

如何使用 Go 的 WithTimeout 检测超时发生

Dalam artikel ini, editor PHP Xinyi akan memperkenalkan anda cara menggunakan fungsi WithTimeout dalam bahasa Go untuk mengesan berlakunya tamat masa. Fungsi WithTimeout ialah fungsi dalam pustaka standard bahasa Go Ia boleh digunakan untuk menetapkan tamat masa Apabila operasi tidak selesai dalam masa yang ditentukan, fungsi ini boleh digunakan untuk menentukan sama ada tamat masa berlaku. Dengan menggunakan fungsi WithTimeout secara rasional, kita boleh mengelakkan menunggu atau menyekat program jangka panjang dan meningkatkan prestasi dan kestabilan program. Seterusnya, kami akan memperkenalkan secara terperinci penggunaan dan langkah berjaga-jaga bagi fungsi WithTimeout untuk membantu anda menguasai dengan lebih baik kemahiran mengendalikan isu tamat masa dalam bahasa Go.

Kandungan soalan

Saya mempunyai kod go berikut:

func MyFunc(ctx context.Context, cfg *Config) (packedevent []byte, err error, publishEvent bool) {
    var cancel context.CancelFunc
    ctx, cancel = context.WithTimeout(ctx, cfg.ScanTimeout)
    defer cancel()

    event := GetEvent(ctx, cfg)
    packedevent, err = PackEvent(event)

    publishEvent = shouldSendToIoT(event)

    return
}
Salin selepas log masuk

Saya cuba menggunakan context.withtimeout untuk membuat tamat masa fungsi.

Apa yang saya tidak dapat fikirkan ialah cara untuk menetapkan err jika tamat masa berlaku.

Saya melihat contoh dalam dokumentasi go tetapi saya tidak begitu memahaminya. <-ctx.done() 情况是否始终意味着已达到超时?这个例子似乎表明了相反的观点 - <-ctx.done() bermakna kod telah selesai tanpa tamat masa.

Saya sedang mencari arahan tentang cara untuk mengesan sama ada kod berjalan dengan context.withtimeout telah tamat masa.

Selain itu, saya ingin memahami di mana dalam kod saya harus menyemak jika tamat masa berlaku. Fikiran pertama saya ialah meletakkan semakan ini di penghujung fungsi, tetapi adakah sudah terlambat untuk menyemak?

Penyelesaian

Untuk mengesan sama ada konteks telah tamat masa, semak ctx.error()。如果错误是 context.canceled,则已使用 cancel() 函数取消上下文。如果是context.deadlineexceeded kemudian ia telah tamat masa.

Untuk menyemak sama ada konteks telah dibatalkan atau tamat masa, gunakan:

select {
   case <-ctx.Done():
       // canceled or timed out
   default:
       // So the select will not block
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk mengesan apabila tamat masa berlaku menggunakan Go's WithTimeout. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!