Rumah >pembangunan bahagian belakang >Golang >Guna semula konteks.WithTimeout dalam fungsi kelewatan

Guna semula konteks.WithTimeout dalam fungsi kelewatan

WBOY
WBOYke hadapan
2024-02-09 16:21:211142semak imbas

在延迟函数中重用 context.WithTimeout

Menggunakan semula konteks.WithTimeout dalam fungsi kelewatan ialah cara yang berkesan untuk menyediakan kawalan dan fleksibiliti yang lebih baik apabila menangani operasi tamat masa. Dengan menggunakan fungsi context.WithTimeout yang disediakan oleh editor PHP Youzi, anda boleh menetapkan tamat masa semasa pelaksanaan fungsi Setelah masa yang ditetapkan melebihi, fungsi akan keluar secara automatik dan mengembalikan mesej ralat. Kaedah ini boleh mengelakkan penyekatan jangka panjang fungsi dan meningkatkan kestabilan dan tindak balas program. Pada masa yang sama, dengan menggunakan semula konteks.DenganHabis Masa dalam fungsi kelewatan, kawalan tamat masa bagi fungsi yang berbeza juga boleh dicapai, menjadikan kod lebih ringkas dan lebih mudah untuk diselenggara.

Kandungan soalan

Coretan kod berikut (dikurangkan untuk ringkas) dari catatan blog go quickstart untuk mongodb mencipta fungsi context.withtimeout ,并将其重用于延迟的 disconnect apabila menyambung ke pangkalan data, yang saya rasa bermasalah.

func main() {
    client, _ := mongo.newclient(options.client().applyuri("<atlas_uri_here>"))
    ctx, _ := context.withtimeout(context.background(), 10*time.second)

    _ = client.connect(ctx)
    defer client.disconnect(ctx)
}

Fikiran saya-

context.withtimeout Tetapkan tarikh akhir dalam masa unix pada penciptaan. Jadi masuk akal untuk menghantarnya kepada connect kerana kami ingin membatalkan proses mewujudkan sambungan apabila had masa (iaitu masa unix terbitan) melebihi.

Sekarang, tambah logik ctx 传递给延迟的 disconnect(很可能在将来稍后调用)将导致 ctx 的时间成为过去。意思是,当函数开始执行时它就已经过期了。这不是预期的结果,并且破坏了引用 disconnect yang sama pada dokumen -

If the context expires via cancellation,
deadline, or timeout before the in use connections have returned, the in use
connections will be closed, resulting in the failure of any in flight read
or write operations.

Sila beritahu saya jika dan bagaimana saya salah dan/atau kehilangan sesuatu.

Penyelesaian

Pemahaman anda betul.

sudah cukup dalam contoh kerana contoh hanya menyambung ke pangkalan data, melakukan beberapa contoh operasi (seperti menyenaraikan pangkalan data) dan kemudian main() tamat, jadi menjalankan putus sambungan yang tertunda dengan konteks yang sama tidak akan menyebabkan sebarang masalah (contoh akan/ harus berfungsi dengan baik dalam masa 10 saat).

Dalam aplikasi "dunia nyata" ini pastinya tidak berlaku. Jadi anda mungkin tidak akan menggunakan konteks yang sama untuk menyambung dan memutuskan sambungan (melainkan konteks itu tidak tamat masa).

Atas ialah kandungan terperinci Guna semula konteks.WithTimeout dalam fungsi kelewatan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Artikel sebelumnya:Tidak dapat menyusun dengan cgoArtikel seterusnya:Tidak dapat menyusun dengan cgo