Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah Goroutine Saya Akan Selesai Selepas Respons HTTP Dihantar?

Adakah Goroutine Saya Akan Selesai Selepas Respons HTTP Dihantar?

Barbara Streisand
Barbara Streisandasal
2024-11-25 21:38:14661semak imbas

Will My Goroutine Finish After the HTTP Response is Sent?

Pelaksanaan Goroutine Di Dalam Pengendali HTTP

Apabila melaksanakan goroutine dalam pengendali HTTP, adalah wajar untuk tertanya-tanya sama ada pelaksanaannya akan diteruskan selepas respons dikembalikan. Pertimbangkan contoh kod berikut:

package main

import (
    "fmt"
    "net/http"
    "time"
)

func worker() {
    fmt.Println("worker started")
    time.Sleep(time.Second * 10)
    fmt.Println("worker completed")
}

func HomeHandler(w http.ResponseWriter, r *http.Request) {
    go worker()
    w.Write([]byte("Hello, World!"))
}

func main() {
    http.HandleFunc("/home", HomeHandler)
    http.ListenAndServe(":8081", nil)
}

Kod ini memutarkan goroutine dalam HomeHandler yang tidur selama 10 saat sebelum pencetakan selesai. Sebaik sahaja respons ditulis, goroutine utama kembali daripada fungsi HomeHandler.

Adakah Goroutine akan Selesai?

Dalam senario khusus ini, goroutine sememangnya akan melengkapkan pelaksanaannya, mencetak pernyataan "pekerja bermula" dan "pekerja selesai" ke konsol. Ini kerana:

  • Groutine dimulakan sebagai urutan pelaksanaan yang berasingan, bebas daripada goroutine utama yang mengendalikan permintaan HTTP.
  • Fungsi pekerja ialah utas ringan yang ' t menggunakan sumber yang besar, jadi ia tidak mungkin dihentikan kerana had sumber sistem.
  • Groutine utama hanya kembali daripada fungsi HomeHandler, bukan daripada fungsi main(). Ini bermakna program terus berjalan di latar belakang, membenarkan goroutine menamatkan pelaksanaannya.

Satu-satunya cara untuk menamatkan goroutine secara pramatang dalam kes ini ialah menghadapi keadaan tidak stabil, seperti berlari kehabisan ingatan, atau menghentikan goroutine secara eksplisit menggunakan teknik penyegerakan (tidak diliputi dalam contoh kod ini).

Atas ialah kandungan terperinci Adakah Goroutine Saya Akan Selesai Selepas Respons HTTP Dihantar?. 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